“set -e” 是什么?
如下脚本:
#!/bin/bash
set -e
command 1
command 2
...
在脚本开头加上set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出。
“set -e” 作用是什么?
“set -e” 弊端是什么?
-
(1)无法检查
$?
,因为如果执行的语句不是返回0,bash将无法执行到检查的代码,形如下面的脚本:#!/bin/bash set -e ... command <== 执行的语句不是返回0,bash将不会往下执行if语句 if [ $? -eq 0 ];then echo "command Failed"; exit 1; fi
-
(2)造成代码无法执行,举例如下:
#!/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",在脚本开发过程中可能很有帮助,而在开发完成后,特别是对于后期可能有升级的脚本,则可能是埋下了安全隐患。
参考文档
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。