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