声明带有进程替换的变量时,是否可以捕获子 shell 的退出代码?

Can the exit code of a subshell be captured when declaring a variable with process substitution?

假设 set -e 对以下所有内容都有效。

这将退出非零:

x=$(false)

但是,其中 none 个将以非零值退出:

declare x=$(false)
readonly x=$(false)
local x=$(false)

如果你想声明一个可变变量,你可以这样做x=$(false)。 但是如果你想要一个只读变量,你必须求助于这样的东西: x=$(false) ; readonly x

但是,如果您在一个函数中并且想要一个局部的、只读的变量,您不能这样做

x=$(false) ; local -r x

因为您将覆盖全局 x。

您可以 local x=$(false) 并尝试手动检查 x 以查看是否有错误。或者,您可以检查 stderr 上的输出。但是,这些都不适用于所有情况;而且,它们很麻烦。

有没有办法在分配结果时从进程替换中获取退出代码?

要检查进程替换的状态,赋值必须是语句执行的唯一事情。在local x=$(false)这样的语句中,返回值是local的状态,一般会成功。要在函数中创建局部只读变量并检查进程替换的赋值,您可以这样做:

local x
x=$(false) || echo "assigment of x failed !!" >&2
readonly x