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

2024-09-29 18:33:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究这个preinst文件的内容,脚本在从Debian归档(.deb)文件中解包之前执行该文件

该脚本具有以下代码:

#!/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软件包系统安装我的软件包,脚本还会删除两个目录

这是对的还是我遗漏了什么


Tags: 文件rm脚本actionssharehomeaddedreturn
3条回答

help set

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

但一些人(bash常见问题解答和irc freenode#bash常见问题解答的作者)认为这是一种不好的做法。建议使用:

trap 'do_something' ERR

发生错误时运行do_something函数

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

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

我是在试图弄清楚由于set -e而中止的脚本的退出状态时发现这篇文章的。答案在我看来并不明显;这就是答案。基本上,set -e中止命令(例如shell脚本)的执行,并返回失败命令的退出状态代码(即内部脚本,而不是外部脚本)

例如,假设我有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

相关问题 更多 >

    热门问题