在Ubuntu /etc/rc.local中处理非零返回值

1 需求

/etc/rc.local中编写并执行函数,使其实现下列功能:

  1. 每次开机时,如果检测到Transmission要使用的指定硬盘分区,则将其挂载到指定目录,否则无操作。
    这一点有点像Windows分配盘符的机制,操作系统事先不会通过/etc/fstab强制要求某个分区必须存在,对移动硬盘、热插拔硬盘位、NAS、SAN等使用模式更加友好。
  2. 如果上一步检测到分区并挂载成功,则sleep一段时间后启动Transmission。
  3. 如果检测到分区但挂载失败,则记录mount命令的返回值并输出。

2 尝试实现

实现前两项功能的函数代码很简单,没什么坑,如下所示:

selective_start_transmission(){
    if [ -b "$TRANSMISSION_SCRATCH_DRIVE_LINK" -a -d "$TRANSMISSION_SCRATCH_DRIVE_MOUNTPOINT" ]; then
        mount "$TRANSMISSION_SCRATCH_DRIVE_LINK" "$TRANSMISSION_SCRATCH_DRIVE_MOUNTPOINT"
        ERRLVL=$?
        if [ "x0" = "x"${ERRLVL} ]; then
            echo "mount: success"
            sleep 5
            if [ -d "$TRANSMISSION_SCRATCH_DIR" ]; then
                systemctl start transmission-daemon
            fi
        else
            echo "mount: error level $ERRLVL"
        fi
    fi
}

然而在处理mount命令的返回值(代码中将其保存到$ERRLVL)时遇到了坑。mount命令返回非零值时,脚本直接退出,第二个if代码块以及后面的脚本都执行不到。

[root@localhost ~]# /etc/rc.local selective_start_transmission
mount: /dev/sdj1 is already mounted or /mnt/WD30EZRX-00 busy
       /dev/sdj1 is already mounted on /mnt/WD30EZRX-00
[root@localhost ~]# echo $?
32

(函数中的两个echo都没有执行)

3 解决方法

如果只是想处理错误的话,把mount写到第二个if [ ]里面就可以,但是这样就拿不到返回值了。
先后查了Bash中try-catch的实现括号的用法$-的含义set命令等资料,没有任何头绪。

于是用了一个比较丑陋的方法解决,也就是mount后面直接跟着ERRLVL=$?,而且无论成功失败都会执行。

    if [ -b "$TRANSMISSION_SCRATCH_DRIVE_LINK" -a -d "$TRANSMISSION_SCRATCH_DRIVE_MOUNTPOINT" ]; then
        ERRLVL='"unset"'
        mount "$TRANSMISSION_SCRATCH_DRIVE_LINK" "$TRANSMISSION_SCRATCH_DRIVE_MOUNTPOINT" && ERRLVL=$? || ERRLVL=$?
        if [ "x0" = "x"${ERRLVL} ]; then
            ......

4 兔子洞大冒险

随后我在这里看到了
#!/bin/bash -x
这种写法,于是看了一眼/etc/rc.local的第一行:

#!/bin/sh -e

我想知道这里的-e是什么意思,于是随手man sh了一下,然后才注意到这里的sh默认是dash,不过也可以在bash和dash间切换
-edash中的含义是:

   Argument List Processing
     All of the single letter options that have a corresponding name can be
     used as an argument to the -o option.  The set -o name is provided next
     to the single letter option in the description below.  Specifying a dash
     “-” turns the option on, while using a plus “+” disables the option.  The
     following options can be set from the command line or with the set
     builtin (described later).
     ...
           -e errexit       If not interactive, exit immediately if any
                            untested command fails.  The exit status of a com‐
                            mand is considered to be explicitly tested if the
                            command is used to control an if, elif, while, or
                            until; or if the command is the left hand operand
                            of an “&&” or “||” operator.

也就是说要try的命令必须立即test,或者放到&&或者||操作符的左侧,否则一旦命令失败,dash会立即终止脚本的运行。这一点和set -e的含义相似,但不完全相同。
-edash中的执行效果如下:

[root@localhost ~]# echo $$
8269
[root@localhost ~]# dash -e
# echo $$
11142
# false
[root@localhost ~]# echo $$
8269

-ebash中的执行效果是一样的:

[root@localhost ~]# echo $$
8269
[root@localhost ~]# bash -e
[root@localhost ~]# echo $$
11157
[root@localhost ~]# false
[root@localhost ~]# echo $$
8269
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,364评论 0 5
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,719评论 0 10
  • 第一章 1.Linux是一套免费使用和自由传播的类UNIX操作系统,它可以基于Intel x86系列处理器以及Cy...
    yansicing阅读 5,324评论 0 9
  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 3,707评论 0 10
  • 观其大纲 第1部分Linux的基础知识第1章Linux概述第2章Linux系统的安装KickStart开始自动安装...
    周少言阅读 1,457评论 1 10