首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“eval $command”和$command有什么区别?

“eval $command”和$command有什么区别?
EN

Stack Overflow用户
提问于 2017-03-24 14:15:38
回答 2查看 3.4K关注 0票数 5

在以下方面有什么区别:

代码语言:javascript
复制
eval echo lala

以及:

代码语言:javascript
复制
command="echo lala"
$command

它们似乎都有相同的效果,但我可能遗漏了一些东西。而且,如果他们具有相同的效果,那么eval命令的意义是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-24 14:31:09

试试这个:

代码语言:javascript
复制
y='FOO=hello; echo $FOO'
eval $y

它打印hello

但这一点:

代码语言:javascript
复制
$y

说:

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

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

如果您知道变量包含可执行命令,则可以不使用eval运行它。但是,如果变量可能包含不仅仅是可执行命令的Bash代码(即可以想象传递给C函数exec()的内容),则需要eval

票数 10
EN

Stack Overflow用户

发布于 2017-03-24 14:37:52

要扩展@JohnZwinck的伟大的answer,请看下面的例子:

代码语言:javascript
复制
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扩展了变量,并将内容按字面处理为命令。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43001805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档