1. 程式人生 > >shell 指令碼中set -e選項作用範圍

shell 指令碼中set -e選項作用範圍

        編寫shell指令碼沒多久,對於其許多命令的具體用法還不太熟悉。最近剛好有需求,就嘗試用指令碼去實現。其中就有用到set -e選項。         在用這個命令之前,也查過其功能,描述比較簡單:就是當命令以非零狀態退出時,則退出shell。主要作用是,當指令碼執行出現意料之外的情況時,立即退出,避免錯誤被忽略,導致最終結果不正確。這裡主要討論的是set -e 選項的作用範圍,建立如下測試檔案:

[email protected]:~/study/scripts$ cat run.sh #!/bin/bash set -e   test_dir/set.sh [email protected]

:~/study/scripts$ cat test_dir/set.sh #!/bin/bash set -e   function return1() {         return 1 } function return0() {         return 0 } function returnf() {         return $1 }   echo "run start" return1 if [ $? -ne 0 ];then         echo "cmd error" fi echo "run end !"

單獨執行test_dir/set.sh時列印如下:

[email protected]

:~/study/scripts$ ./test_dir/set.sh run start 即return1語句返回非零,立即退出執行。說明set -e 選項有效。接著將test_dir/set.sh中的set -e 遮蔽掉再執行run.sh時:

[email protected]:~/study/scripts$ ./run.sh run start cmd error run end ! 列印和程式流程相符。說明run.sh中set -e選項在set.sh中不起作用。看似此選項的只作用於當前指令碼,不作用於其所呼叫的指令碼。如此? 將run.sh指令碼修改如下,並執行:

[email protected]

:~/study/scripts$ cat run.sh #!/bin/bash set -e   . test_dir/set.sh [email protected]:~/study/scripts$ ./run.sh run start

說明set -e 選項對set.sh起作用。指令碼作為一個程序去描述set -e選項的範圍應該是:set -e選項只作用於當前進行,不作用於其建立的子程序。 set -e 命令用法總結如下: 1. 當命令的返回值為非零狀態時,則立即退出指令碼的執行。 2. 作用範圍只限於指令碼執行的當前進行,不作用於其建立的子程序。 3. 另外,當想根據命令執行的返回值,輸出對應的log時,最好不要採用set -e選項,而是通過配合exit 命令來達到輸出log並退出執行的目的。  

注:編譯此文件時,出現行間距不一致的情況 ,編輯器也沒找到可調整的選單。結果發現shift + enter / delete 鍵可以比較方便的控制。