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

为什么bash eval在命令退出时返回0,状态为>;0?,bash,eval,exit-code,Bash,Eval,Exit Code,我无法理解这样一个事实,即在命令执行中使用Basheval,如果执行状态明显为0,那么执行结果仍然为0。考虑这个例子: > eval "$(exit 42)" > echo $? 0 命令$(exit 42)本身的exit code>0,因此根据man页面,eval应将自身返回一个退出状态42 eval [arg ...] The args are read and concatenated together into a single command. This comm

我无法理解这样一个事实,即在命令执行中使用Bash
eval
,如果执行状态明显为0,那么执行结果仍然为0。考虑这个例子:

> eval "$(exit 42)"
> echo $?
0
命令
$(exit 42)
本身的exit code>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.

我误解了什么?

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

“$(退出42)”
扩展为空字符串,命令变为
eval“”
,并成功退出

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

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

> x=$(exit 42)
++ exit 42
+ x=
> echo "$?"
+ echo 42
42
另请参见单引号是不同的,因为扩展由eval
eval'$(出口42)
返回42进行处理

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

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

“$(退出42)”
扩展为空字符串,命令变为
eval“”
,并成功退出

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

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

> x=$(exit 42)
++ exit 42
+ x=
> echo "$?"
+ echo 42
42
另请参见单引号是不同的,因为扩展由eval
eval'$(出口42)
返回42进行处理

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

也许可以单独指出,
eval“exit 42”
确实会按预期失败,并退出当前shell。是的,OP没有理解在调用eval之前命令替换正在发生。或者单独指出,
eval“exit 42”
确实会按预期失败,是的,在再次阅读这个问题时,OP不知道在调用eval之前命令替换正在发生