内置POSIX shell eval
有用性的"规范"示例如下:
>foo=10
>x=foo
>eval y='$'$x
>echo $y
10
但是POSIX shell标准规定:
The eval utility shall construct a command by concatenating arguments together, separating each with a <space> character. The constructed command shall be read and executed by the shell.
事实上,我找不到任何非平凡(即其结果不能更简单地)使用eval
的例子。
请告诉我。
不进行连接
cmdOutput=$( eval "$cmd" )
可以,但是
cmdOutput=$( eval $cmd )
如果$cmd
包含空格,将不存在。虽然这两个命令通常会产生相同的输出,但第一个命令创建一个临时字符串,将其作为单个参数提供给eval
,然后再次销毁,而第二个命令则不这样做。
然而,这在某些极端情况下可能会产生影响,这就是为什么我说"通常"的原因。上图:
ls_date=$( printf '%sn%s' ls main.bash )
echo "1: $( eval $ls_date -l )"
echo
echo "2: $( eval "$ls_date -l" )"
输出:1: -rwxrwxrwx 1 root root 112 Jan 6 23:31 main.bash
main.bash: line 5: main.bash: command not found
2: main.bash
在第一种情况下,main.bash
和-l
都被视为ls
的参数。在第二种情况下,ls
和main.bash
被视为单独的命令,-l
将是第二个命令的参数(然而main.bash
没有x位设置,也不在路径中)。
最后但并非最不重要的:语法分析器将尝试解析eval
之后的未引号语法,但它们通常不会解析任何引号语法,除了$-expressions ($var
, $(cmd)
和$((<math>))
)。