Unix Linux指令碼中 set e 的作用

2021-08-19 22:58:12 字數 1797 閱讀 5781

編寫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 ...