shell 中的 set -e , set +e 用法

set -e # Exit the script if an error happens

脚本A 

set +e # don't bail out of bash script if ccache doesn't exist

脚本B

set -e # back to regular "bail out on error" mode

脚本C


如上面一个 脚本 shell ,

A  和 C 中的 脚本 执行的时候 如果  出现了 返回值 为 非零 ,整个脚本 就会立即退出 

B 脚本 中如果 出现了 返回值 为 非零 将 会 继续 执行 下面的 脚本 C 。

set -e

set命令的-e参数,linux自带的说明如下:

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

也就是说,在"set -e"之后出现的代码,一旦出现了返回值非零,整个脚本就会立即退出。有的人喜欢使用这个参数,是出于保证代码安全性的考虑。但有的时候,这种美好的初衷,也会导致严重的问题。

真实案例:

脚本a.sh开头使用了"set -e",且能正常运行。在几个月或更久以后,因需求升级,在脚本中增加了3行hadoop操作:

#!/bin/bash

set -e

...

/home/work/.../hadoop dfs -rmr /app/.../dir

/home/work/.../hadoop dfs -mkdir /app/.../dir

/home/work/.../hadoop dfs -put file_1 /app/.../dir/

...

这几行hadoop命令逻辑很简单:在hdfs上清除并新建一个目录,并将一份本地文件推送至这个目录,供后续使用。将这几行单拎出来,在命令行下执行,除了提示待删除的目录不存在,并没有什么问题,文件还是会被推送到指定的地方。

但第一次执行这个脚本的时候,却失败退出了,且导致调用该脚本的程序整体退出,造成了严重的后果。原因是hdfs上还没有这个目录,rmr这一行会返回255,这个值被脚本前方的"set -e"捕捉到,直接导致了脚本退出。

新增的代码本身并没有问题,先删除再新建目录,反而是保证数据安全的比较规范的操作,删除命令本身的容错性,可以保证后续命令正常执行。事实是这个脚本有好几百行,且逻辑比较复杂,在增加这几行代码的时候,开发人员已经不记得这个脚本里还有个"set -e"埋伏着了。

可见设置"set -e",在脚本开发过程中可能很有帮助,而在开发完成后,特别是对于后期可能有升级的脚本,则可能是埋下了安全隐患。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 图片发自简书App 前言 很久之前就看到过这个观点:房子是租来的,但生活不是。 为什么突然又想到这一点呢?在外工作...
    才fa现阅读 827评论 1 6
  • 现代生活中,因为工作、家庭、教育等各种原因,时时感觉到压力的存在。 从医学角度来讲,压力来临的时候,要及时的舒解,...
    强叔说管理阅读 1,029评论 0 1
  • 黑暗期•自我怀疑 走出校园的象牙塔后,由于思维没有转变,所以在复杂的社会丛林,走了不少弯路。 有被文化公司忽悠过去...
    程意凉阅读 489评论 30 20
  • 体验: 当背不动了,就看开了; 当记不清了,就放下了; 精进: 转换思维,享受生活,快乐每一天!
    summerzsf阅读 143评论 0 0

友情链接更多精彩内容