有什么区别:
eval echo lala
和
command="echo lala"
$command
他们似乎都有相同的效果,但我可能会遗漏一些东西。另外,如果他们做具有相同的效果,那么eval
命令的重点是什么?
答案 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会扩展变量,并将内容视为命令。