问题
我正在研究这个预安装(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命令