前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Bash脚本中 set -e 是什么意思

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

作者头像
程序熵
发布2024-05-17 20:40:39
530
发布2024-05-17 20:40:39
举报
文章被收录于专栏:技术汇技术汇

问题

我正在研究这个预安装(preinst)脚本的内容,该脚本会在从 Debian 软件包(.deb)文件解压该包之前执行。

脚本包含以下代码:

代码语言:javascript
复制
#!/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

我的第一个问题是关于这行代码的:

代码语言:javascript
复制
set -e

我认为脚本的其余部分相当简单:它检查 Debian/Ubuntu 包管理器是否正在执行安装操作。如果是,它会进一步检查我的应用程序是否刚刚被安装在系统上。如果已经安装,脚本会打印消息 "MyApplicationName is just installed" 并结束(return 1 意味着以“错误”结束,对吧?)。

如果用户正在请求 Debian/Ubuntu 包系统安装我的包,脚本还会删除两个目录。

这个理解正确吗,还是我漏掉了什么?

问答

help set 命令和 Bash 参考文档中的描述来看,set 内建命令:

代码语言:javascript
复制
  -e  Exit immediately if a command exits with a non-zero status.

但是,一些人(包括 Bash FAQ 的作者和 IRC Freenode 的 #bash 频道的 FAQ 维护者)认为这是一种不良实践。他们建议使用:

代码语言:javascript
复制
trap 'do_something' ERR

发生错误时运行 do_something 函数。

详见 Why doesn't set -e (or set -o errexit, or trap ERR) do what I expected?

示例代码 trap-err-demo.sh

代码语言:javascript
复制
#!/usr/bin/env bash
trap onexit ERR

#--- onexit() -----------------------------------------------------
#  @param $1 integer  (optional) Exit status.  If not set, use `$?'
function onexit() {
    local exit_status=${1:-$?}
    echo Exiting $0 with $exit_status
    exit $exit_status
}

i=0
let i++
echo "i is $i"

测试对比:

参考:

  • stackoverflow question 19622198
  • help set
  • help trap
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 问答
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档