博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unix/Linux 脚本中 “set -e” 的作用
阅读量:5232 次
发布时间:2019-06-14

本文共 996 字,大约阅读时间需要 3 分钟。

1
2
#!/bin/bash
set 
-e

  在文件开头加上set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出。

  这样的好处是防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉。如果要增加可读性,可以使用set -o errexit,它的作用与set -e相同。

  使用-e帮助你检查错误。如果你忘记检查(执行语句的结果),bash会帮你执行。

 

也就是说,在"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",在脚本开发过程中可能很有帮助,而在开发完成后,特别是对于后期可能有升级的脚本,则可能是埋下了安全隐患。

 
 

转载于:https://www.cnblogs.com/mafeng/p/10170602.html

你可能感兴趣的文章
Spring属性注入
查看>>
Springboot-配置文件
查看>>
Springboot-日志框架
查看>>
SpringBoot-thymeleaf
查看>>
P1908-逆序对
查看>>
P1192-台阶问题
查看>>
ACM模板——康托展开
查看>>
P1025-数的划分
查看>>
P1305-新二叉树
查看>>
给网站配置免费的HTTS证书
查看>>
android 往sd卡中写入文件
查看>>
mysql主从同步配置和读写分离实现(中间件Amoeba)
查看>>
golang lua使用示例
查看>>
64位win2003/win2008系统IIS6.0/7.5配置PHP的方法
查看>>
5月深度学习班第3课梯度下降法与反向传播
查看>>
内存溢出和内存泄漏
查看>>
css选择器
查看>>
tomcat简单使用
查看>>
CSS布局奇淫技巧之--各种居中
查看>>
清除浮动
查看>>