Bash:使用 set -e 期望不同的退出代码
Bash: Expect different exit code with set -e
考虑在启用 set -e
的情况下执行的 bash 脚本(出错时退出)。
脚本中的命令之一returns 预期的非零退出代码。如何仅在命令返回此退出代码时才恢复脚本?请注意,退出代码零也应算作错误。最好是单线解决方案。
示例:
set -e
./mycommand # only continue when exit code of mycommand is '3', otherwise terminate script
...
这将由两部分组成:检测错误代码 3,并将零变为另一个
一个可能的解决方案是这样的
mycommand && false || [ $? -eq 3 ]
第一个 &&
运算符将零退出代码变为 1(使用 false
- 如果应考虑 1 "good",则更改为其他内容),然后使用测试来将 "good exit code" 更改为 3.
更简单的 easier-to-maintain 方法是使用子 shell:
( mycommand; [ $? -eq 3 ] )
该子 shell 将 运行 mycommand
正常,其退出代码将是后者的 sub-command。请确保您不会 shopt -s inherit_errexit
破坏它:)
不使用 Charles Duffy 在评论中指出的 set -e
是有问题的:
# don't use set -e
./mycommand
if (( $? != 3 ))
then
exit
fi
# more script contents follow
您可以将其缩短为:
# don't use set -e
./mycommand
(( $? != 3 )) && exit
# more script contents follow
考虑在启用 set -e
的情况下执行的 bash 脚本(出错时退出)。
脚本中的命令之一returns 预期的非零退出代码。如何仅在命令返回此退出代码时才恢复脚本?请注意,退出代码零也应算作错误。最好是单线解决方案。
示例:
set -e
./mycommand # only continue when exit code of mycommand is '3', otherwise terminate script
...
这将由两部分组成:检测错误代码 3,并将零变为另一个
一个可能的解决方案是这样的
mycommand && false || [ $? -eq 3 ]
第一个 &&
运算符将零退出代码变为 1(使用 false
- 如果应考虑 1 "good",则更改为其他内容),然后使用测试来将 "good exit code" 更改为 3.
更简单的 easier-to-maintain 方法是使用子 shell:
( mycommand; [ $? -eq 3 ] )
该子 shell 将 运行 mycommand
正常,其退出代码将是后者的 sub-command。请确保您不会 shopt -s inherit_errexit
破坏它:)
不使用 Charles Duffy 在评论中指出的 set -e
是有问题的:
# don't use set -e
./mycommand
if (( $? != 3 ))
then
exit
fi
# more script contents follow
您可以将其缩短为:
# don't use set -e
./mycommand
(( $? != 3 )) && exit
# more script contents follow