我一直在编写一些 shell 脚本,如果任何命令失败时能够停止执行所述 shell 脚本,我会发现它很有用。请参阅下面的示例:
#!/bin/bash cd some_dir ./configure --some-flags make make install
所以在这种情况下,如果脚本不能更改到指定的目录,那么如果它失败了,它肯定不想在之后执行 ./configure 。
现在我很清楚我可以对每个命令进行 if 检查(我认为这是一个没有希望的解决方案),但是如果其中一个命令失败,是否有一个全局设置可以使脚本退出?
使用set -e内置:
set -e
#!/bin/bash set -e # Any subsequent(*) commands which fail will cause the shell script to exit immediately
-e或者,您可以在命令行上传递:
-e
bash -e my_script.sh
您也可以使用 禁用 此行为set +e。
set +e
您可能还想使用全部或部分 the-e -u -x和-o pipefail选项,如下所示:
-u
-x
-o pipefail
set -euxo pipefail
-e出错时退出,-u未定义变量出错,-o (for option) pipefail命令管道失败时退出。一些陷阱和变通方法在此处得到了很好的记录。
-o (for option) pipefail
(*) 笔记:
如果失败的命令是紧跟在 while* 或 until 关键字之后的命令列表的一部分、位于 if 或 elif保留字之后的测试的一部分、在 & &或 || 中执行的任何命令的一部分,则shell 不会 退出 列出除了最后的 & &或 ||之后的命令 , 管道中除最后一个以外的任何命令,或者命令的返回值是否与 ! ***
(来自man bash)
man bash