当前位置: 首页 > article >正文

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

问题

我正在研究这个预安装(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 is just installed” 并结束(return 1 意味着以“错误”结束,对吧?)。

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

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

问答

help set 命令和 Bash 参考文档中的描述来看,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 函数。

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

示例代码 trap-err-demo.sh

#!/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

相关阅读:

  • 在Bash中解析命令行参数的两种样例脚本
  • 在Bash shell脚本中如何检查一个目录是否存在
  • 2>&1是什么意思
  • Bash中 $$ $! $# $0 $? $* $@ 等各种符号的含义
  • 如何使用bash脚本并行运行多个程序
  • 如何在bash中使用getopts (参数解析工具)
  • 为什么要使用xargs命令

http://www.kler.cn/a/374184.html

相关文章:

  • 使用yolov3配置文件训练自己的数据
  • 2025年NPDP产品经理认证考试时间和报考条件
  • 《文心一言插件设计与开发》赛题三等奖方案 | NoteTable
  • 从0开始学python-day18-Python包和模块2
  • Vue插件能做什么,Vue如何自定义插件
  • 直接删除Github上的文件
  • STM32(hal库)中Systick是如何默认进行计时1ms的?
  • PHP语言学习教程:从入门到精通
  • C++ 快乐数 —— 优先算法(双指针思想)
  • 模板初阶及STL简介
  • 鸿蒙HarmonyOS NEXT一多适配技术方案
  • vue 和 django 报 CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,
  • 二百七十五、Kettle——ClickHouse增量导入数据补全以及数据修复记录表数据(实时)
  • 20.04Ubuntu搭建Vscode
  • Nature Electronics 用于语音识别的液体声传感器,基于悬浮在载液的钕-铁-硼磁性纳米颗粒
  • AI内容生成器 V1.6 WordPress插件 基于AI生成内容 Openai Content Generator
  • 数据结构-希尔排序(ShellSort)笔记
  • 重新架构:从 Redis 到 SQLite 性能提升
  • MySQL基本用法
  • 经典面试题收集(持续更新)
  • 基于人脸识别PCA算法matlab实现及详细步骤讲解
  • 面试题整理 3
  • 我自己的资料整理导引(三):文本格式基础
  • C++算法练习-day29——104.二叉树的最大深度
  • Java基础3-字符串及相关操作
  • 使用正则表达式验证积累