在阅读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
这里到底发生了什么,美元符号和反斜杠是如何与问题联系在一起的?
发布于 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!
发布于 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 >
发布于 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的使用并不是不安全的,因为我们事先确切地知道要计算的是什么。
https://stackoverflow.com/questions/11065077
复制相似问题