'eval $ command'和$ command之间有什么区别?

时间:2017-03-24 14:15:38

标签: bash eval

有什么区别:

eval echo lala

command="echo lala"
$command

他们似乎都有相同的效果,但我可能会遗漏一些东西。另外,如果他们具有相同的效果,那么eval命令的重点是什么?

2 个答案:

答案 0 :(得分:5)

试试这个:

y='FOO=hello; echo $FOO'
eval $y

打印hello。但是这个:

$y

表示:

  

-bash:FOO = hello;:找不到命令

因此,当您说eval $y时,就好像您已将$y的内容输入到解释器中一样。但是当你只说$y时,它需要是一个可以运行的命令,而不是解释器需要解析的其他一些令牌(在上面的例子中,是一个变量赋值)。

如果您知道变量包含可执行命令,则可以在不使用eval的情况下运行它。但是,如果变量可能包含Bash代码,而不是简单的可执行命令(即您可以想象传递给C函数exec()的东西),则需要eval

答案 1 :(得分:3)

要扩展@ JohnZwinck的精彩answer,请查看以下示例:

command='ls | wc -l'
eval $command
# outputs the correct result => 17
$command
ls: -l: No such file or directory
ls: wc: No such file or directory
ls: |: No such file or directory

command='ls -l $PWD'
eval $command
# outputs the contents of current directory
$command
# runs 'ls -l $PWD' literally as a command and ls tries to lookup $PWD as a file
ls: $PWD: No such file or directory

因此,eval builtin以与shell相同的方式解释其参数。但是,在$command的情况下,shell会扩展变量,并将内容视为命令。