在 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
是行不通的。
我对使用 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
是行不通的。