如果git pull失败,则中止bash脚本。

29 浏览
0 Comments

如果git pull失败,则中止bash脚本。

我有一个 Bash shell 脚本,调用了许多命令。\n如果任何一个命令返回非零值,我希望这个 shell 脚本能自动以返回值 1 的方式退出。\n是否可以在不显式检查每个命令结果的情况下实现这一点?\n例如,\n

做某事1
如果 [[ $? -ne 0 ]]; then
    退出 1
fi
做某事2
如果 [[ $? -ne 0 ]]; then
    退出 1
fi

0
0 Comments

问题:如何在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

0
0 Comments

有时候,仅仅使用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

感谢解释了pipefailset -o的重要性!

值得注意的是,在Bash中,set -o pipefailset -e的组合效果很好。但是在ksh(93)中却不行,而Bash正是从ksh中引入了这个功能。在ksh中,需要在管道后面进行额外的检查以便以错误退出。

0
0 Comments

问题的出现的原因是希望在git pull失败时中止bash脚本的执行。解决方法是在脚本的开头添加

set -e

,这将导致如果一个简单命令以非零退出值退出,shell会立即退出。简单命令是不属于ifwhileuntil测试的任何命令,或者是&&||列表中的命令。如果使用bash,则可以使用

set -Eeuo pipefail

来提供更多类似的错误处理。这被认为是新bash程序的合理默认值。如果在函数体内声明函数,则函数体内的函数需要重新声明set -e以扩展此功能。此外,如果使用source命令来执行脚本,则shebang行将变得无关紧要。可以使用set +e在脚本的其他部分再次禁用错误失败。需要注意的是,在不同版本的bash中,-e(errexit)的行为不一致,因此必须仔细测试。在复杂的脚本中,可能会因为像管道或if-then语句中的错误而被忽略。如果希望在脚本中对特定命令进行例外处理而不使用set -e,是否有办法实现。

0