任何命令失败时都存在脚本

时间:2013-08-13 13:13:53

标签: shell

我有一个大型shell脚本,可以安装一堆东西。 9/10次,它会正常工作,但是,由于互联网连接问题,它有时会失败。

目前我有

apt-get install -y apache2 || { exit 1; }

它有效。

我知道!!类似于最后一个命令。

然而,这不起作用

apt-get install -y apache2 || { echo "!! Failed"; exit 1; }

如果失败,我希望输出为:

apt-get install -y apache2 Failed

最后,有没有办法在每个命令后都没有|| { echo "!! Failed"; exit 1; }

2 个答案:

答案 0 :(得分:1)

在你的剧本中,说

set -e
# some arbitrary command
apt-get install -y apache2
# more commands

如果任何后续命令返回非零退出代码,这将使脚本退出,并且除了脚本中的每个命令之外,不需要放置|| exit

来自manual

  

-e

     

如果管道(参见管道)可能包含一个简单命令(参见简单命令),子shell命令,则立即退出   括在括号中(请参阅命令分组)或其中一个命令   作为由大括号括起的命令列表的一部分执行(请参阅命令   分组)返回非零状态。如果是,shell不会退出   失败的命令是紧跟在a之后的命令列表的一部分   while或者直到关键字,if语句中的部分测试,部分   在&&||列表中执行的任何命令,但以下命令除外   最后的&&||,管道中的任何命令,但是最后一个,或者如果是   命令的返回状态正在被!反转。 ERR上的陷阱,如果   set,在shell退出之前执行。

     

此选项适用于shell环境和每个子shell   单独的环境(请参阅命令执行环境),并可能   导致子shell退出之前执行所有命令   子外壳。

答案 1 :(得分:0)

结合this question的信息,以下内容适用于BASH(也可能适用于其他shell):

trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG
trap 'if [ $? -ne 0 ]; then echo "$previous_command Failed"; fi' EXIT
set -e

或者,您可以使用内置跟踪,但这将打印每个命令,而不仅仅是失败的命令:

set -ex