我有一个大型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; }
。
答案 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