为什么在状态> 0退出的命令中,bash eval返回0?

时间:2018-10-23 10:14:11

标签: bash eval exit-code

我无法理解以下事实:在明显以状态> 0退出的命令执行上使用Bash eval仍然返回0。请考虑以下示例:

> eval "$(exit 42)"
> echo $?
0

仅命令$(exit 42)的退出代码> 0,因此根据man页,eval应该返回自身的退出状态42 ...

eval [arg ...]
    The args are read and concatenated together into a single command. This command is
    then read and executed by the shell, and its exit status is returned as the value
    of eval. If there are no args, or only null arguments, eval returns 0.

我误会什么?

1 个答案:

答案 0 :(得分:3)

再次阅读问题和手册摘录,在调用eval之前扩展eval的参数。

"$(exit 42)"扩展为空字符串,命令变为eval '',成功退出。

set -x可用于跟踪正在发生的事情

set -x
> eval "$(exit 42)"
++ exit 42
+ eval ''

但是

> x=$(exit 42)
++ exit 42
+ x=
> echo "$?"
+ echo 42
42

另请注意,单引号不同,因为扩展由eval eval '$(exit 42)'处理,返回42

> eval '$(exit 42)'
+ eval '$(exit 42)'
+++ exit 42