为什么eval搞乱printf'\ n',以及在哪里查找eval上的信息

时间:2014-08-16 09:17:42

标签: bash

我之前有一个关于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'"

不像以前那样工作

3 个答案:

答案 0 :(得分:4)

eval printf '\n'

shell将此命令读作三个单词:evalprintf\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