我知道这是一个常见问题,我什至以前见过它的答案,但我不记得它们是什么,也找不到它们。
#!/usr/bin/env bash
set -m # allow for job control
EXIT_CODE=0 # exit code of overall script
function foo() {
for job in `jobs -p`; do
echo "PID => ${job}"
wait ${job} || { echo "At least one test failed with exit code => $?" ; EXIT_CODE=1; }
done
}
trap 'foo' CHLD
我的问题涉及这一行:
wait ${job} || { echo "At least one test failed with exit code => $?" ; EXIT_CODE=1; }
如果wait ${job}
产生非零退出代码,我想回显该语句,然后进行赋值(将 1 赋值给EXIT_CODE
)。
我不相信我的语法是正确的。我没有收到任何明显的错误,但我很确定它不正确,因为该声明没有得到回应。但我仍然以退出代码 1 退出。
答案1
您确定wait
以非零退出状态终止吗?例如考虑:
false || { echo "At least ..."; EXIT_CODE=1; }
这将生成消息并进行EXIT_CODE
适当设置。
我最初以为这就是您正在寻找的:
wait ${job} || ( echo "At least ..."; EXIT_CODE=1 )
这种方法的问题在于, 的内容(...)
是在子shell 中执行的——对值的更改EXIT_CODE
将是该子shell 的本地更改(即,当您稍后尝试读取它时,它将不可见)。
例如考虑:
EXIT_CODE=0
false || ( echo "At least ..." ; EXIT_CODE=1; echo "code: ${EXIT_CODE}" )
echo "final code: ${EXIT_CODE}"
输出将是:
At least ...
code: 1
final code: 0
我建议不要尝试太花哨:
if ! wait ${job}; then
echo "At least ..."
EXIT_CODE=1;
fi