0

我有一个大型的 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; }每个命令之后都有。

4

2 回答 2

1

在你的脚本中,说

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

如果任何后续命令以非零退出代码返回,这将使脚本退出,并且无需|| exit在脚本中放置每个命令。

手册

-e

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

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

于 2013-08-13T13:17:51.390 回答
0

结合来自这个问题的信息,以下内容适用于 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
于 2013-08-13T13:21:30.793 回答