命令替换后的管道状态

l0b*_*0b0 9 bash pipe

我想将一系列命令的结果发送给变量:

variable=$(a | few | commands)
Run Code Online (Sandbox Code Playgroud)

但是,命令替换重置PIPESTATUS,所以我无法检查事后的错误.一种解决方案是mktemp暂时使用并将结果放在那里:

variable_file=$(mktemp) || exit 1
a | few | commands > $variable_file
exit_codes="${PIPESTATUS[*]}"
variable=$(<$variable_file)
Run Code Online (Sandbox Code Playgroud)

有更优雅的解决方案吗?

eph*_*ent 8

有点hacky,但我认为你可以像这样捏造它.

variable=$(a | few | commands; echo ": ${PIPESTATUS[*]}")
PIPESTATUS=(${variable##*: })
variable=${variable%:*}
variable=${variable%$'\n'}
Run Code Online (Sandbox Code Playgroud)