POSIX shell内置多参数eval的用途是什么?



内置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的参数。在第二种情况下,lsmain.bash被视为单独的命令,-l将是第二个命令的参数(然而main.bash没有x位设置,也不在路径中)。

最后但并非最不重要的:语法分析器将尝试解析eval之后的未引号语法,但它们通常不会解析任何引号语法,除了$-expressions ($var, $(cmd)$((<math>)))。

最新更新