首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Bash中的eval命令及其典型用法

Bash中的eval命令及其典型用法
EN

Stack Overflow用户
提问于 2012-06-17 00:13:41
回答 5查看 413.7K关注 0票数 186

在阅读bash手册页之后,请参考此post

我仍然无法理解eval命令到底做了什么以及它的典型用法是什么。例如,如果我们这样做:

bash$ set -- one two three  # sets $1 $2 $3
bash$ echo $1
one
bash$ n=1
bash$ echo ${$n}       ## First attempt to echo $1 using brackets fails
bash: ${$n}: bad substitution
bash$ echo $($n)       ## Second attempt to echo $1 using parentheses fails
bash: 1: command not found
bash$ eval echo \${$n} ## Third attempt to echo $1 using 'eval' succeeds
one

这里到底发生了什么,美元符号和反斜杠是如何与问题联系在一起的?

EN

回答 5

Stack Overflow用户

发布于 2014-10-23 01:29:13

根据我的经验,eval的一个“典型”用法是运行生成shell命令来设置环境变量的命令。

也许您有一个使用环境变量集合的系统,并且您有一个脚本或程序来确定应该设置哪些变量以及它们的值。无论何时运行脚本或程序,它都是在派生进程中运行的,因此当它退出时,它直接对环境变量所做的任何操作都会丢失。但是该脚本或程序可以将导出命令发送到stdout。

如果不使用eval,则需要将stdout重定向到临时文件,获取该临时文件的源文件,然后将其删除。使用eval,您只需:

eval "$(script-or-program)"

请注意,引号很重要。举个(人为的)例子:

# activate.sh
echo 'I got activated!'

# test.py
print("export foo=bar/baz/womp")
print(". activate.sh")

$ eval $(python test.py)
bash: export: `.': not a valid identifier
bash: export: `activate.sh': not a valid identifier
$ eval "$(python test.py)"
I got activated!
票数 31
EN

Stack Overflow用户

发布于 2014-09-23 17:13:00

eval语句告诉shell将eval的参数作为命令,并通过命令行运行它们。在下面这样的情况下,它很有用:

在你的脚本中,如果你将一个命令定义到一个变量中,然后你想要使用这个命令,那么你应该使用eval:

/home/user1 > a="ls | more"
/home/user1 > $a
bash: command not found: ls | more
/home/user1 > # Above command didn't work as ls tried to list file with name pipe (|) and more. But these files are not there
/home/user1 > eval $a
file.txt
mailids
remote_cmd.sh
sample.txt
tmp
/home/user1 >
票数 12
EN

Stack Overflow用户

发布于 2018-01-06 03:12:30

我最初故意不学习如何使用eval,因为大多数人会建议像远离瘟疫一样远离它。然而,我最近发现了一个用例,它让我觉得不能更快地识别它。

如果您希望以交互方式运行cron作业以进行测试,则可以使用cat查看文件的内容,然后复制并粘贴cron作业以运行该作业。不幸的是,这涉及到触摸鼠标,这在我的书中是一种罪过。

假设您在/etc/cron.d/repeatme上有一个cron作业,其中包含以下内容:

*/10 * * * * root program arg1 arg2

您不能将其作为前面有所有垃圾的脚本来执行,但我们可以使用cut来清除所有垃圾,将其包装在一个子subshell中,并使用eval执行字符串

eval $( cut -d ' ' -f 6- /etc/cron.d/repeatme)

cut命令仅打印文件的第6个字段,以空格分隔。然后Eval执行该命令。

我在这里使用了cron作业作为示例,但其概念是格式化来自stdout的文本,然后计算该文本。

在这种情况下,eval的使用并不是不安全的,因为我们事先确切地知道要计算的是什么。

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

https://stackoverflow.com/questions/11065077

复制
相关文章

相似问题

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