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

时间:2013-09-17 12:13:50

标签: bash eval

有谁可以告诉我这里有什么大的区别以及为什么后者不起作用?

test="ls -l"

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

eval $test
echo `$test`

但在这种情况下:

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

eval $test
echo `$test`

后者不起作用。这是为什么?我知道eval只是在撇号执行时执行脚本并将结果作为字符串返回。什么使得无法在命令中使用>>或simmilar东西来执行?也许是否有一种方法可以使它与撇号一起工作而我做错了什么?

2 个答案:

答案 0 :(得分:3)

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

ls -l '>>' test.log

使>>的{​​{1}}和test.log参数变为ls(请注意>>周围的引号)。

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

ls -l >> test.log

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

答案 1 :(得分:0)

eval是'表达值',即

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

在终端中以与

相同的方式执行
ls -l >> test.log

是否

echo仅用于显示目的。