为了账号安全,请及时绑定邮箱和手机立即绑定

set -e在bash脚本中的含义是什么?

set -e在bash脚本中的含义是什么?

幕布斯7119047 2019-07-23 16:13:18
set -e在bash脚本中的含义是什么?我正在研究脚本在从Debian存档(.deb)文件解压缩该包之前执行的这个preinst文件的内容。该脚本具有以下代码:#!/bin/bashset -e# Automatically added by dh_installinitif [ "$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软件包系统安装我的软件包,该脚本还会删除两个目录。这是对的还是我错过了什么?
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

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


查看完整回答
反对 回复 2019-07-23
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

根据bash - Set Builtin手册,如果设置了-eerrexit,如果管道由单个简单命令列表复合命令返回非零状态,则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 $?success0$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?success0$ 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


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 860 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信