以下腳本:html
#!/bin/bash set -e command 1 command 2 ...
在腳本開頭加上set -e,這句語句告訴bash若是任何語句的執行結果不是true則應該退出。shell
(1)使用-e幫助你檢查錯誤;安全
(2)防止錯誤像滾雪球般變大致使一個致命的錯誤,而這些錯誤本應該在以前就被處理掉;bash
set -o errexit
,它的做用與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