如果git pull失败,则中止bash脚本。
问题:如何在git pull失败时中止bash脚本,并提供解决方法?
原因:
在bash脚本中,如果git pull命令失败,我们希望能够中止脚本的执行。然而,在示例中使用的if语句是不必要的。
解决方法:
我们可以使用以下方式来实现中止脚本的执行:
dosomething1 || exit 1
如果使用了set -e
选项,则对于某些命令,我们可能需要使用以下方式:
dosomething || true
这样,即使命令失败,|| true
也会使命令管道返回一个true
值,从而不会使脚本中止。
另外,set -e
选项不仅适用于bash脚本,它甚至在最初的Bourne Shell中也被支持。
有关这些操作符的更多信息,请参考此处的链接:opensource.com/article/18/11/control-operators-bash-shell
有时候,仅仅使用set -e
是不够的,特别是当你使用了管道。例如,假设你有这样一个脚本:
#!/bin/bash set -e ./configure > configure.log make
这段脚本按预期工作:如果configure
出错,脚本会中止执行。但是,明天你做了一个看似微不足道的改变:
#!/bin/bash set -e ./configure | tee configure.log make
现在脚本不再工作了。这个问题在这里解释了,并且提供了一个解决方法(仅适用于Bash):
#!/bin/bash
set -e
set -o pipefail
./configure | tee configure.log
make
感谢解释了pipefail
与set -o
的重要性!
值得注意的是,在Bash中,set -o pipefail
和set -e
的组合效果很好。但是在ksh(93)中却不行,而Bash正是从ksh中引入了这个功能。在ksh中,需要在管道后面进行额外的检查以便以错误退出。
问题的出现的原因是希望在git pull失败时中止bash脚本的执行。解决方法是在脚本的开头添加
set -e
,这将导致如果一个简单命令以非零退出值退出,shell会立即退出。简单命令是不属于if
、while
、until
测试的任何命令,或者是&&
或||
列表中的命令。如果使用bash,则可以使用
set -Eeuo pipefail
来提供更多类似的错误处理。这被认为是新bash程序的合理默认值。如果在函数体内声明函数,则函数体内的函数需要重新声明set -e
以扩展此功能。此外,如果使用source
命令来执行脚本,则shebang行将变得无关紧要。可以使用set +e
在脚本的其他部分再次禁用错误失败。需要注意的是,在不同版本的bash中,-e
(errexit)的行为不一致,因此必须仔细测试。在复杂的脚本中,可能会因为像管道或if-then语句中的错误而被忽略。如果希望在脚本中对特定命令进行例外处理而不使用set -e
,是否有办法实现。