在 Bash 中,如何从嵌套在复杂语句中的命令捕获退出状态代码

In Bash, how to capture exit status code from a command nested within a complex statement

我对使用 bash 比较陌生。我已经通过 HPC 系统上的 SLURM 继承了这段代码 运行 一个命令:

CMD="srun -srunParam1 ... -srunParamN ./scriptToRun.sh -scriptParam1"
exec 5>&1
results=$(eval "${CMD}" | tee - >&5)) 

一切正常。

但是,我需要捕获 eval "${CMD}" 的退出状态,但不知道该怎么做。

最初,我把exitStatus=$?放在results=...命令之后;但是,我相信这是在捕捉为 results 变量赋值的状态,而不是 eval ${CMD}

脚本继续处理 $results 中的输出。我不太明白为什么要在这里打开文件描述符(或者,如何正确使用文件描述符)。但是,我会把它留到进一步 research/a 单独的问题。

EDIT: I commented out the bits with the file descriptor, and observed that the script still works, but $results does not contain the output from running $CMD - it only contains the post-processing of $CMD.

获取状态的一种方法是将其保存在文件中:

results=$( { eval "${CMD}"; echo $? > /tmp/cmd_status.txt; } | tee - >&5)) 
# Process /tmp/cmd_status.txt here

Bash 有 PIPESTATUS:

results=$(eval "${CMD}" | tee - >&5; exit ${PIPESTATUS[0]}) 
exitStatus=$?

请注意,在上面的代码中,我们正在检查子 shell ($(...)) 中 运行 命令的退出状态;在父级中访问 PIPESTATUS 是行不通的。