协慌网

登录 贡献 社区

在 bash 脚本中 set -e 是什么意思?

我正在研究脚本从该脚本的 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.

但这被某些人(bash FAQ 和 irc freenode #bash FAQ 的作者)认为是不好的做法。建议使用:

trap 'do_something' ERR

发生错误时运行do_something

参见http://mywiki.wooledge.org/BashFAQ/105

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

set -e而中止的脚本的退出状态是什么时找到了这篇文章。答案对我来说似乎并不明显。因此这个答案。基本上, set -e中止命令(例如 shell 脚本)的执行,并返回失败命令的退出状态代码(即内部脚本,而不是外部脚本)

例如,假设我有外壳程序脚本outer-test.sh

#!/bin/sh
set -e
./inner-test.sh
exit 62;

inner-test.sh的代码是:

#!/bin/sh
exit 26;

当我从命令行运行outer-script.sh ,我的外部脚本以内部脚本的退出代码终止:

$ ./outer-test.sh
$ echo $?
26