在以下方面有什么区别:
eval echo lala以及:
command="echo lala"
$command它们似乎都有相同的效果,但我可能遗漏了一些东西。而且,如果他们具有相同的效果,那么eval命令的意义是什么?
发布于 2017-03-24 14:31:09
试试这个:
y='FOO=hello; echo $FOO'
eval $y它打印hello。
但这一点:
$y说:
-bash: FOO=hello;:命令未找到
因此,当您说eval $y时,就好像您在解释器中输入了$y的内容一样。但是,当您只说$y时,它需要的是可以运行的命令,而不是解释器需要解析的其他标记(在上面的示例中,变量赋值)。
如果您知道变量包含可执行命令,则可以不使用eval运行它。但是,如果变量可能包含不仅仅是可执行命令的Bash代码(即可以想象传递给C函数exec()的内容),则需要eval。
发布于 2017-03-24 14:37:52
要扩展@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内置的解释其参数的方式与shell解释的方式相同。但是,在$command的情况下,shell扩展了变量,并将内容按字面处理为命令。
https://stackoverflow.com/questions/43001805
复制相似问题