假设将以下命令存储在变量中:
COMMAND='echo hello'有什么区别
$ eval "$COMMAND"
hello
$ bash -c "$COMMAND"
hello
$ $COMMAND
hello?为什么上一个版本几乎从来没有使用过,如果它是较短的和(据我所能看到)做完全相同的事情?
发布于 2015-12-23 02:06:56
第三种形式一点也不像其他两种形式--但是要理解为什么,我们需要在解释命令时按照bash的操作顺序,看看在使用每种方法时都遵循了哪些操作。
Bash解析阶段
使用eval "$string"
eval "$string"遵循从#1开始的所有上述步骤。
>()这样的特殊运算符被处理。$foo这样的扩展是受尊重的。使用sh -c "$string"
...performs和eval一样,但是在作为单独进程启动的新shell中;因此,当这个新进程退出时,对变量状态、当前目录等的更改将过期。(还请注意,新shell可能是支持不同语言的不同解释器;即。sh -c "foo"将不支持与bash、ksh、zsh等相同的语法)。
使用$string
...starts在步骤5,“分词”。
这是什么意思?
引号不受尊重。
因此,printf '%s\n' "two words"将解析为printf %s\n "two words",而不是printf %s\n two words的通常/预期行为(其中的引号由shell使用)。
拆分为多个命令(在;s、&或类似的命令上)不会发生。
因此:
s='echo foo && echo bar'
$s...will发出以下输出:
foo && echo bar如果不是这样的话,就会出现以下...instead:
foo
bar特殊运算符和扩展不受尊重。
没有$(foo),没有$foo,没有<(foo)等等。
重定向不受尊重。
>foo或2>&1只是由字符串拆分创建的另一个单词,而不是shell指令。
https://stackoverflow.com/questions/34427146
复制相似问题