学习笔记: shell 中的 set -e , set +e 用法
来源:互联网 发布:最简单小游戏编程 编辑:程序博客网 时间:2024/04/27 14:52
from:
http://blog.csdn.net/xiaofei125145/article/details/39345331
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",在脚本开发过程中可能很有帮助,而在开发完成后,特别是对于后期可能有升级的脚本,则可能是埋下了安全隐患。
0 0
- 学习笔记: shell 中的 set -e , set +e 用法
- 学习笔记: shell 中的 set -e , set +e 用法
- 学习笔记: shell 中的 set -e , set +e 用法
- shell 中的 set -e , set +e 用法
- shell 脚本中set -e 的用法
- shell set -e
- linux shell 脚本中的set -e 是什么意思?
- linux shell 命令 set -e
- set -e
- set -e $@
- shell 中的 set命令 -e -o 选项作用
- linux中的set命令: "set -e" 与 "set -o pipefail"
- inux中的set命令: "set -e" 与 "set -o pipefail"
- linux中的set命令: "set -e" 与 "set -o pipefail"
- linux中的set命令: "set -e" 与 "set -o pipefail"
- linux中的set命令: "set -e" 与 "set -o pipefail"
- 嵌入式 linux下shell命令set“-e”
- set -e set -o pipefail
- Linux cpumask分析
- C#-鼠标操作
- Guice之Servlet基础
- ioctl()函数的简单使用——获取本机的IP、掩码、HWaddr
- 使用JDBC实现对数据库的简单操作
- 学习笔记: shell 中的 set -e , set +e 用法
- 关于C#引用Dll后,找不到命名空间的问题
- AJAX基本内容
- 坐标位置浅谈
- C#-支持文件拖拽
- offlineimap读取qq邮箱
- JSP中JSTL和EL表达式的用法
- 如何在GitHub上发现优秀的开源项目
- HDFS 配置、启动命令、测试命令