我有一个shell脚本,执行一些命令。我如何使shell脚本退出,如果任何命令退出与非零退出码?
当前回答
如果在Bash中只调用exit而不带任何参数,它将返回上一个命令的退出代码。结合OR, Bash应该只在前面的命令失败时调用exit。但是我还没有测试过。
command1 || exit; command2 || exit;
Bash还将最后一个命令的退出码存储在变量$?
其他回答
#
#------------------------------------------------------------------------------
# purpose: to run a command, log cmd output, exit on error
# usage:
# set -e; do_run_cmd_or_exit "$cmd" ; set +e
#------------------------------------------------------------------------------
do_run_cmd_or_exit(){
cmd="$@" ;
do_log "DEBUG running cmd or exit: \"$cmd\""
msg=$($cmd 2>&1)
export exit_code=$?
# If occurred during the execution, exit with error
error_msg="Failed to run the command:
\"$cmd\" with the output:
\"$msg\" !!!"
if [ $exit_code -ne 0 ] ; then
do_log "ERROR $msg"
do_log "FATAL $msg"
do_exit "$exit_code" "$error_msg"
else
# If no errors occurred, just log the message
do_log "DEBUG : cmdoutput : \"$msg\""
fi
}
如果你想用$?,您将需要在每个命令后检查它,因为$?在每个命令退出后更新。这意味着如果您执行一个管道,您将只获得管道中最后一个进程的退出码。
另一种方法是这样做:
set -e
set -o pipefail
如果将它放在shell脚本的顶部,Bash似乎会为您处理它。正如前面的帖子所指出的,“set -e”将导致Bash在任何简单命令上都出错退出。"set -o pipefail"将导致Bash在管道中的任何命令上都出错而退出。
有关这个问题的更多讨论,请参见这里或这里。下面是Bash手册中关于内置设置的部分。
Bash的:
# This will trap any errors or commands with non-zero exit status
# by calling function catch_errors()
trap catch_errors ERR;
#
# ... the rest of the script goes here
#
function catch_errors() {
# Do whatever on errors
#
#
echo "script aborted, because of errors";
exit 0;
}
在Bash中,这很简单。用&&把它们连在一起:
command1 && command2 && command3
你也可以使用嵌套的if结构:
if command1
then
if command2
then
do_something
else
exit
fi
else
exit
fi
[ $? -eq 0 ] || exit $?; # Exit for nonzero return code