假设您将以下命令存储在变量中:
COMMAND='echo hello'
之间有什么区别
$ eval "$COMMAND" hello $ bash -c "$COMMAND" hello $ $COMMAND hello
?如果最后一个版本较短,为什么最后一个版本几乎从未使用过(据我所知)却完全相同?
第三种形式与其他两种形式完全不同,但是要理解为什么,我们需要在解释命令时使用bash时要遵循的操作顺序,并查看在使用每种方法时应遵循哪些操作。
eval "$string"
eval "$string"从#1开始执行上述所有步骤。从而:
>()
$foo
sh -c "$string"
…的性能与之相同eval,但 在作为单独过程启动的新外壳中 ;因此,当此新进程退出时,对变量状态,当前目录等的更改将过期。(注意,那就是,新的外壳可以是不同的解释支持不同的语言;即sh -c "foo"不支持相同的语法bash,ksh,zsh等做的)。
eval
sh -c "foo"
bash
ksh
zsh
$string
…从第5步“单词拆分”开始。
这是什么意思?
printf '%s\n' "two words"因此将解析为printf %s\n "two words",这与的通常/预期行为printf %s\n two words(外壳使用了引号)相反。
printf '%s\n' "two words"
printf
%s\n
"two
words"
two words
;
&
从而:
s='echo foo && echo bar' $s
…将发出以下输出:
foo && echo bar
…而不是以下情况:
foo bar
不$(foo),不$foo,不<(foo),等等。
$(foo)
<(foo)
>foo或者2>&1只是通过字符串拆分创建的另一个单词,而不是shell指令。
>foo
2>&1