Unix/Linux shell脚本中 “set -e” 的作用--转载

缺水的鱼 发表于 2019/11/28 21:40:52 2019/11/28
【摘要】 set -e” 是什么?如下脚本:#!/bin/bashset -ecommand 1command 2...在脚本开头加上set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出。“set -e” 作用是什么?(1)使用-e帮助你检查错误;(2)防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉;(3)如果要增加可读性,可以使用set -o e...

set -e” 是什么?

如下脚本:

#!/bin/bash
set -e
command 1
command 2
...

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

“set -e” 作用是什么?

  • (1)使用-e帮助你检查错误;

  • (2)防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉;

  • (3)如果要增加可读性,可以使用set -o errexit,它的作用与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",在脚本开发过程中可能很有帮助,而在开发完成后,特别是对于后期可能有升级的脚本,则可能是埋下了安全隐患。

参考文档

1574948417110948.png

1574948417791595.jpg


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。