e意味着在bash脚本中?

我正在研究该脚本在从Debian存档(.deb)文件解压缩之前执行的preinst文件的内容。

该脚本具有以下代码:

#!/bin/bash
set -e
# Automatically added by dh_installinit
if [ "$1" = install ]; then
   if [ -d /usr/share/MyApplicationName ]; then
     echo "MyApplicationName is just installed"
     return 1
   fi
   rm -Rf $HOME/.config/nautilus-actions/nautilus-actions.conf
   rm -Rf $HOME/.local/share/file-manager/actions/*
fi
# End automatically added section

我的第一个查询是关于该行:

set -e

我认为脚本的其余部分非常简单:它检查Debian / Ubuntu包管理器是否正在执行安装操作。 如果是,它会检查我的应用程序是否刚安装在系统上。 如果有,脚本打印消息“MyApplicationName刚刚安装”并结束( return 1意味着以“错误”结束,不是吗?)。

如果用户要求Debian / Ubuntu软件包系统安装我的软件包,那么脚本也会删除两个目录。

这是对的还是我错过了什么?


help set

  -e  Exit immediately if a command exits with a non-zero status.

但它不是很可靠,被认为是不好的做法,更好地使用:

trap 'do_something' ERR

在发生错误时运行do_something函数。

请参阅http://mywiki.wooledge.org/BashFAQ/105


set -e在命令或管道有错误时停止执行脚本 - 这与默认shell行为相反,即忽略脚本中的错误。 在终端中键入help set以查看此内置命令的文档。


根据bash - Set Builtin手册,如果设置了-e / errexit ,如果一个管道包含一个简单命令,一个列表或一个复合命令返回一个非零状态,shell将立即退出。

默认情况下,管道的退出状态是管道中最后一个命令的退出状态,除非启用了pipefail选项(默认情况下它被禁用)。

如果是这样,管道的最后(最右边)命令的返回状态以非零状态退出,如果所有命令都成功退出,则为零。

如果您想在退出时执行某些操作,请尝试定义trap ,例如:

trap onexit EXIT

其中onexit是您在退出时执行某些操作的函数,如下面是打印简单堆栈跟踪所示:

onexit(){ while caller $((n++)); do :; done; }

有类似的选项-E / errtrace可以在ERR上捕获,例如:

trap onerr ERR

例子

零状态示例:

$ true; echo $?
0

非零状态示例:

$ false; echo $?
1

否定状态示例:

$ ! false; echo $?
0
$ false || true; echo $?
0

测试pipefail被禁用:

$ bash -c 'set +o pipefail -e; true | true | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; true | true | false; echo success'; echo $?
1

测试并启用pipefail

$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1
链接地址: http://www.djcxy.com/p/4353.html

上一篇: e mean in a bash script?

下一篇: Looping through the content of a file in Bash