从错误上自动退出bash shell脚本:set + e似乎没有完成这项工作

se8*_*84 3 linux error-handling bash shell ubuntu

虽然我知道20年来shell脚本并不关心错误,但我默默地对这种粗心大意感到好笑.即使你明确要求他们不要吞下错误并遵循崩溃早期原则仍然不会发生.

参考自动退出bash shell脚本出错,set +e似乎没有完成这项工作,这里有一个简短的例子:

#!/bin/bash -vx
set +e
apt-get install nonexisting1
apt-get install nonexisting2
set -e
Run Code Online (Sandbox Code Playgroud)

输出:

#!/bin/bash -vx
set +e
+ set +e
apt-get install nonexisting1
+ apt-get install nonexisting1
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package nonexisting1  <--- first error, now stop!
apt-get install nonexisting2           <--- why do we continue here?
+ apt-get install nonexisting2
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package nonexisting2
set -e
+ set -e
Run Code Online (Sandbox Code Playgroud)

如何确保我的脚本执行所有命令而不会出现错误或立即停止?我不喜欢|| exit 1在几乎所有行的末尾写作.

小智 5

我猜您只是在使用set + e代替set -e,反之亦然。如果你只是做

#!/bin/bash -vx
set -e
apt-get install nonexisting1
apt-get install nonexisting2
set +e
Run Code Online (Sandbox Code Playgroud)

它应该在第一行之后停止。


rgh*_*ome 5

shell中的选项(反直觉地)使用减号打开并使用加号关闭.

即便如此,该set -e选项仅在程序正确返回非零错误状态时才有效.

虽然apt-get手册说它应该这样做,但其他帖子表明它经常没有(参见apt-get update退出状态).

运行后验证apt命令的返回状态(例如使用echo $?).如果它返回非零,set -e应该工作.