我无法理解以下事实:在明显以状态> 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.
我误会什么?
答案 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