我有一个bash脚本,我用它来按顺序执行多个命令,如果序列中至少有一个命令返回非零退出代码,我需要返回非零退出代码.我知道有一个wait
命令,但我不确定我是否理解如何使用它.
UPD脚本如下所示:
#!/bin/bash
command1
command2
command3
Run Code Online (Sandbox Code Playgroud)
所有命令都在前台运行.无论上一个命令返回哪个退出状态,所有命令都需要运行(因此它不能表现为"第一次出错时退出").基本上我需要收集所有退出状态并相应地返回全局退出状态.
kan*_*kan 42
去做就对了:
EXIT_STATUS=0
command1 || EXIT_STATUS=$?
command2 || EXIT_STATUS=$?
command3 || EXIT_STATUS=$?
exit $EXIT_STATUS
Run Code Online (Sandbox Code Playgroud)
如果几个命令失败,不确定它应返回哪种状态.
如果顺序你的意思是管道,那么你需要pipefail
在你的脚本中设置如set -o pipefail
.来自man bash
:
除非启用了pipefail选项,否则管道的返回状态是最后一个命令的退出状态.如果启用了pipefail,则管道的返回状态是以非零状态退出的最后(最右侧)命令的值,如果所有命令都成功退出,则返回零.如果保留字!在管道之前,该管道的退出状态是如上所述的退出状态的逻辑否定.shell在返回值之前等待管道中的所有命令终止.
如果您只是表示顺序命令,那么只需检查每个命令的退出状态,如果退出状态为零,则设置一个标志.让您的脚本返回标志的值,如:
#!/bin/bash
EXIT=0
grep -q A <<< 'ABC' || EXIT=$? # Will exit with 0
grep -q a <<< 'ABC' || EXIT=$? # Will exit with 1
grep -q A <<< 'ABC' || EXIT=$? # Will exit with 0
echo $EXIT # Will print 1
exit $EXIT # Exit status of script will be 1
Run Code Online (Sandbox Code Playgroud)
这使用逻辑运算符OR ||
仅设置EXIT
命令是否失败.如果多个命令失败,则脚本将返回上一个失败命令的退出状态.
如果这些命令没有在后台运行,那么wait
这里不相关.