如果&&中发生错误并使用set -e,脚本将继续执行

时间:2018-11-02 15:13:25

标签: bash shell scripting

如果在脚本中我使用set -e,则该脚本在用&&执行两个命令的语句中发生错误之后继续执行。

例如:

set -e

cd nonexistingdirectory && echo "&&"
echo continue

这将提供以下输出:

./exit.sh: line 3: cd: nonexistingdirectory: No such file or directory
continue

我希望脚本在cd nonexistingdirectory之后退出并停止。

我该怎么做?

**编辑** 我有多个使用&&的脚本,需要对其进行修复以确保它们在出错时退出。但是我想要一个最小的影响/风险解决方案。我将尝试使用注释中提到的解决方案,以将&&替换为;的{​​{1}}。

2 个答案:

答案 0 :(得分:4)

这是设计使然。如果您使用&&,则bash假定您想自己处理错误,因此它不会在第一个命令失败时终止。

可能的解决方法:

set -e

cd nonexistingdirectory
echo "&&"
echo continue

现在只有两种可能性:

  1. cd成功,并且脚本照常继续。
  2. cd失败,由于set -e,bash中止了执行。

答案 1 :(得分:3)

这里的问题是您的&&命令。

实际上,当一个检索错误的命令与另一个命令一起执行(&&)时,set -e不起作用。

如果您能更好地解释实际用例,我们可以找到适合您需求的解决方案。

  

set [+abefhkmnptuvxBCEHPT] [+o option] [arg ...]

     

-e如果管道(可能由一个简单命令组成),用括号括起来的subshel​​l命令或                         用大括号括起来的命令列表(请参阅上面的SHELL GRAMMAR)中执行的命令之一以非零状态退出。                         如果失败的命令是紧随一段时间或直到关键字之后的命令列表的一部分,则外壳程序不会退出,                         在if或elif保留字之后的测试的一部分,在&& 或||中执行的任何命令的一部分列出除命令fol-                         降低最后一个&&或||,管道中除最后一个命令之外的任何命令,或者如果命令的返回值正用!反转。

来自man bash