在 Bash 指令碼中 set -e
Nilesh Katuwal
2023年1月30日
如果命令返回非零退出狀態,set -e
選項指示 shell 退出。簡單來說,shell 在命令失敗時退出。
在 Debian 包管理指令碼中,set -e
也稱為 set -o errexit
。根據 Debian 政策,在某些指令碼中需要使用此選項;目標似乎是避免出現任何未處理的錯誤情況。
實際上,這意味著你必須瞭解你執行的命令可能返回錯誤的情況並明確解決每個問題。
在 Bash 的函式體之外使用 set -e
讓我們編寫一個 Bash 指令碼來使用 hello_world
函式列印 Hello World
。我們將在函式之外使用 set -e
。
set -e
僅用於編寫或設定錯誤顯示程式碼。
#!/bin/bash
set -e
function hello_world()
{
echo "Hello World!"
}
hello_world
輸出:
Hello World!
在 Bash 的函式體內使用 set -e
現在,我們將把 set -e
放在上述指令碼的函式中。
#!/bin/bash
function hello_world()
{
set -e
echo "Hello World!"
}
hello_world
輸出:
Hello World!
在函式內部或外部使用 set-e
不會影響我們的輸出。
set -e
和 trap
set -e
命令指示終端在檢測到錯誤時丟擲異常,從而導致程式碼停止執行。trap
關鍵字允許你使用內建函式 ERR
,它接受錯誤行號並將其傳遞給錯誤函式。
讓我們看一個例子。
#!/bin/bash
set -e
function error()
{
echo "error at $1"
}
trap 'error $LINENO' ERR
errors
我們建立了一個函式 error
並使用 shell 變數 $1
來儲存發生錯誤的行號。
輸出:
demo.sh: line 9: errors: command not found
error at 9
demo.sh
是包含上述指令碼的指令碼檔案的名稱。
如果指令碼的一行失敗,但最後一行成功,則整個指令碼被認為是成功的。因此,很容易忽略錯誤。
容錯在指令碼中要好得多,而 set -e
為你提供了這一點。