使用 && 和 || 时无法停止 BASH运营商

Cannot stop BASH when using of && and || operators

如果命令有任何错误,我想停止我的 BASH。

make clean || ( echo "ERROR!!" && echo "ERROR!!" >> log_file && exit 1 )

但我的 BASH 似乎还在继续。如何将 exit 1 放在单行运算符

我是 BASH 的新手,非常感谢您的帮助!

exit 1() 创建的子 shell 退出,而不是原来的 shell。使用 {} 将命令组保持在相同的 shell.

不要在命令之间使用 && 除非你想在其中一个失败时立即停止。使用 ; 分隔同一行的命令。

make clean || { echo "ERROR!!" ; echo "ERROR!!" >> log_file ; exit 1 ;}

或者直接使用if更容易理解。

if ! make clean
then
    echo "ERROR!!"
    echo "ERROR!!" >> log_file
    exit
fi

您在 中有直接的解决方案。如果您想以类似的方式检查多个命令,另一种方法是定义一个可以重复使用的函数:

die() {
    echo "ERROR: $@"
    echo "ERROR: $@" >> log_file
    exit 1
}

make clean || die "I left it unclean"
make something || die "something went wrong"

或者,如果您希望脚本在出现问题的第一个迹象时结束,您可以使用 set -e

set -e

make clean     # stops here unless successful
make something # or here if this line fails etc.

您可能还想记录一条错误消息,因此您可以在 ERR 上安装 traperrfunc 将在退出脚本之前调用,并记录失败的行号:

errfunc() {
    echo "ERROR on line "
    echo "ERROR on line " >> log_file
}

trap 'errfunc $LINENO' ERR
set -e

make clean
make something