&& / || 中的复合命令状况

&& / || 中的复合命令状况

我知道这是一个常见问题,我什至以前见过它的答案,但我不记得它们是什么,也找不到它们。

#!/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

相关内容