eval 和反引号之间的区别(反撇号)

Kel*_*all 7 bash eval

谁能告诉我这里的最大区别是什么,为什么后者不起作用?

test="ls -l"
Run Code Online (Sandbox Code Playgroud)

现在两者都可以正常工作:

eval $test
echo `$test`
Run Code Online (Sandbox Code Playgroud)

但在这种情况下:

test="ls -l >> test.log"

eval $test
echo `$test`
Run Code Online (Sandbox Code Playgroud)

后者将不起作用。这是为什么?我知道 eval 只是执行一个脚本,而撇号正在执行它并将结果作为字符串返回。是什么使得无法>>在命令中使用或类似的东西来执行?也许有没有办法让它与撇号一起工作,而我做错了什么?

dev*_*ull 6

当您使用反引号执行命令时,发送到 shell 的命令是:

ls -l '>>' test.log
Run Code Online (Sandbox Code Playgroud)

这使得>>test.log参数都为ls(注意周围的引号>>)。

使用时eval,正在执行的命令是:

ls -l >> test.log
Run Code Online (Sandbox Code Playgroud)

(通过说bash -vx scriptname来执行你的脚本,看看发生了什么。)

  • 这是否意味着,反引号实际上是用空格拆分它们正在解释的字符串,并将第一个元素作为命令,而后者作为参数?而你对此无能为力? (2认同)