第三种形式与其他两种形式完全不同,但是要理解为什么,我们需要在解释命令时使用bash时要遵循的操作顺序,并查看在使用每种方法时应遵循哪些操作。
Bash解析阶段
- 报价处理
- 拆分为命令
- 特殊运算符解析
- 扩展
- 分词
- 乱语
- 执行
使用 eval "$string"
eval "$string"从#1开始执行上述所有步骤。从而:
- 字符串中的文字引号变为语法引号
- 特殊运算符如
>()
被处理 - 扩展如
$foo
感到非常荣幸 - 这些扩展的结果按字符分成空格,分成单独的单词
- 如果这些词按相同的方式解析并具有可用的匹配项,则这些词将被扩展为glob,最后执行命令。
使用 sh -c "$string"
…的性能与之相同
eval,但 在作为单独过程启动的新外壳中
;因此,当此新进程退出时,对变量状态,当前目录等的更改将过期。(注意,那就是,新的外壳可以是不同的解释支持不同的语言;即
sh -c"foo"不支持相同的语法
bash,
ksh,
zsh等做的)。
使用 $string
…从第5步“单词拆分”开始。
这是什么意思?
行情不被接受。
printf '%sn' "two words"因此将解析为
printf
%sn
"two
words",这与的通常/预期行为
printf
%sn
two words(外壳使用了引号)相反。
不会拆分为多个命令(在;
s,&
s或类似命令上)。
从而:
s='echo foo && echo bar'$s
…将发出以下输出:
foo && echo bar
…而不是以下情况:
foobar
特殊操作员和扩展人员不予接受。
不
$(foo),不
$foo,不
<(foo),等等。
重定向不适用。
>foo或者
2>&1只是通过字符串拆分创建的另一个单词,而不是shell指令。



