Unix/Linux shell腳本中 “set -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",在腳本開發過程中可能很有幫助,而在開發完成後,特別是對於後期可能有升級的腳本,則可能是埋下了安全隱患。

參考文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章