編寫shell指令碼沒多久,對於其許多命令的具體用法還不太熟悉。最近剛好有需求,就嘗試用指令碼去實現。其中就有用到set -e選項。
在用這個命令之前,也查過其功能,描述比較簡單:就是當命令以非零狀態退出時,則退出shell。主要作用是,當指令碼執行出現意料之外的情況時,立即退出,避免錯誤被忽略,導致最終結果不正確。這裡主要討論的是set -e 選項的作用範圍,建立如下測試檔案:
[plain]
view plain
copy
zhenglei@szexdroid14:~/study/scripts$ cat run.sh
#!/bin/bash
set -e
test_dir/set.sh
zhenglei@szexdroid14:~/study/scripts$ cat test_dir/set.sh
#!/bin/bash
set -e
function return1()
function return0()
function returnf()
echo "run start"
return1
if [ $? -ne 0 ];then
echo "cmd error"
fi
echo "run end !"
單獨執行test_dir/set.sh時列印如下:
[python]
view plain
copy
zhenglei@szexdroid14:~/study/scripts$ ./test_dir/set.sh
run start
即return1語句返回非零,立即退出執行。說明set -e 選項有效。接著將test_dir/set.sh中的set -e 遮蔽掉再執行run.sh時:
[python]
view plain
copy
zhenglei@szexdroid14:~/study/scripts$ ./run.sh
run start
cmd error
run end !
列印和程式流程相符。說明run.sh中set -e選項在set.sh中不起作用。看似此選項的只作用於當前指令碼,不作用於其所呼叫的指令碼。如此?
將run.sh指令碼修改如下,並執行:
[python]
view plain
copy
zhenglei@szexdroid14:~/study/scripts$ cat run.sh
#!/bin/bash
set -e
. test_dir/set.sh
zhenglei@szexdroid14:~/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 鍵可以比較方便的控制。
詳解Unix Linux中Shell指令碼的輸入輸出
shell的i o語法比較複雜,難以理解,更難以正確使用。shell的輸入輸出語法有兩個難點 重定向和檔案描述符。我以前對shell指令碼輸入 輸出的理解也有錯誤。最近重新整理思路,決定寫一篇文章來總結i o重定向。一 先介紹幾個基本概念 1 檔案 file 在unix linux中,檔案型別有七種...
Unix Linux指令碼中 set e 的作用
有些指令碼中會看到這樣的語句 html view plain copy print?bin bash set e command 1 command 2 exit 0 bin bash set e command 1 command 2 exit 0 set e 這句語句告訴bash如果任何語句的執...
Bash指令碼中的set命令
伺服器的開發和管理離不開 bash 指令碼,掌握它需要學習大量的細節。set命令是 bash 指令碼的重要環節,卻常常被忽視,導致指令碼的安全性和可維護性出問題。本文介紹它的基本用法,讓你可以更安心地使用 bash 指令碼。我們知道,bash 執行指令碼的時候,會建立乙個新的 shell。bash ...