我之前有一个关于bash eval
的问题,响应者向我确认在这种情况下我必须使用eval
。
eval
上的手册说 - 这就是说我害怕 -
eval [arguments]
将参数连接成一个命令,然后读取并执行该命令,并将其退出状态作为eval的退出状态返回。如果没有参数或只有空参数,则返回状态为零。
现在我遇到了这个问题:
bash> printf '\n'
bash> eval printf '\n'
nbash>
为什么?为什么eval(我必须使用,不是在这种情况下使用SSCCE,但在实际情况下)会损害printf的效果?
我希望手册能说明bash和eval的行为方式。以前的响应者在哪里找到所有这些信息,看起来比手册所说的更多(如上所示)。
好的,响应者建议引用。很好,但现在我真的需要这个
bash> printf "foo bar"'\n'
使用eval。如果我做
bash eval "printf foo bar'\n'"
不像以前那样工作
答案 0 :(得分:4)
eval printf '\n'
shell将此命令读作三个单词:eval
,printf
和\n
。解析这些单词后,单引号不再存在。
eval
命令现在可以对此进行评估:printf \n
,并且由于反斜杠未包含在引号中,因此它将被丢弃。因此,这相当于:
eval printf n
答案 1 :(得分:3)
这是您要评估的实际命令:
# echo printf '\n'
printf \n
这是您评估的命令的结果:
# printf \n
n
答案 2 :(得分:0)
用echo替换eval以“看”正在执行的内容:
$ echo printf '\n'
printf '\n'
该命令会发生什么?,试一试:
$ printf \n
n
由于没有引用该值,它失去了对printf的特殊含义。
所以,最后,问题是引用问题(与eval一样)。
$ eval printf \''done %s\n'\' \'test\'
done test