Unix/Linux shell脚本中 “set -e” 的做用

“set -e” 是什么?

以下脚本:html

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

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

“set -e” 做用是什么?

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

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

  • (3)若是要增长可读性,可使用set -o errexit,它的做用与set -e相同;

“set -e” 弊端是什么?

  • (1)没法检查$?,由于若是执行的语句不是返回0,bash将没法执行到检查的代码,形以下面的脚本:app

    #!/bin/bash
    set -e
    ...
    command  <== 执行的语句不是返回0,bash将不会往下执行if语句
    if [ $? -eq 0 ];then   
    echo "command failed";   
    exit 1;   
    fi
  • (2)形成代码没法执行,举例以下:ide

    #!/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上清除并新建一个目录,并将一份本地文件推送至这个目录,供后续使用。将这几行单拎出来,在命令行下执行,除了提示待删除的目录不存在,并无什么问题,文件仍是会被推送到指定的地方。oop

    但第一次执行这个脚本的时候,却失败退出了,且致使调用该脚本的程序总体退出,形成了严重的后果。缘由是hdfs上尚未这个目录,rmr这一行会返回255,这个值被脚本前方的"set -e"捕捉到,直接致使了脚本退出。命令行

    说明⚠️:code

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

参考文档

相关文章
相关标签/搜索