Linux 中退出碼的含義
退出碼(退出狀態(tài))可以告訴我們最后一次執(zhí)行的命令的狀態(tài)。在命令結束以后,我們可以知道命令是成功完成的還是以錯誤結束的。
其基本思想是,程序返回退出代碼 0
時表示執(zhí)行成功,沒有問題。代碼 1
或 0
以外的任何代碼都被視為不成功。
退出碼除了 0 和 1 外還有很多值,我將在本文介紹它們。
Linux Shell 中的各種退出碼
我們來快速了解一下 Linux Shell 中的主要退出碼:
退出碼 | 解釋 |
| 命令成功執(zhí)行 |
| 通用錯誤代碼 |
| 命令(或參數)使用不當 |
| 權限被拒絕(或)無法執(zhí)行 |
| 未找到命令,或 |
| 命令被信號從外部終止,或遇到致命錯誤 |
| 通過 |
| 通過 |
| 退出碼超過了 0-255 的范圍,因此重新計算(LCTT 譯注:超過 255 后,用退出碼對 256 取模) |
??
130
(SIGINT
或^C
)和143
(SIGTERM
)等終止信號是非常典型的,它們屬于128+n
信號,其中n
代表終止碼。
在簡單了解了退出碼之后,我們來看看它們的用法。
獲取退出碼
前一個命令執(zhí)行的退出碼存儲在 特殊變量 $?
中。你可以通過運行以下命令來獲取:
echo $?
我們在所有演示中都將使用它來獲取退出代碼。
請注意,exit
命令支持以帶著前一條命令相同的退出碼退出。
退出碼 0
退出碼 0
表示命令執(zhí)行無誤,這是完成命令的理想狀態(tài)。
例如,我們運行這樣一條基本命令
neofetch
echo $?
這個退出碼 0
表示特定命令已成功執(zhí)行,僅此而已。讓我們再演示幾個例子。
你可以嘗試 終止一個進程;它也會返回代碼 0
。
pkill lxappearance
查看文件內容也會返回退出碼 0,這僅意味著 cat
命令執(zhí)行成功。
退出碼 1
退出碼 1
也很常見。它通常表示命令以一般錯誤結束。
例如,在沒有 sudo 權限的情況下使用 軟件包管理器,就會返回代碼 1
。在 Arch Linux 中,如果我運行下面的命令:
pacman -Sy
它會返回 1
, 表示上一條命令運行出錯。
exit code 1 (impermissible operation resulted in this code)
?? 如果你在基于 Ubuntu 的發(fā)行版中嘗試這樣做(不使用
sudo
執(zhí)行apt update
),運行后會得到錯誤碼100
,表示你是在沒有權限的情況下運行apt
。100
不是標準錯誤碼,而是apt
特有的錯誤碼。
雖然這是一般的理解,但我們也可以將其解釋為 “不被允許的操作”。
除以 0
等操作也會返回錯誤碼 1
。
Division by zero results in code 1
退出碼 2
這個退出碼出現在當執(zhí)行的命令有語法錯誤時。濫用命令參數也會導致此錯誤。
一般來說,它表示由于使用不當,命令無法執(zhí)行。
例如,我在一個本應只有一個連字符的選項上添加了兩個連字符,那么此時會出現退出碼 2。
grep --z file.txt
Invalid argument resulted in exit code 2
當權限被拒絕時,比如訪問 /root
文件夾,就會出現錯誤碼 2
。
Permission denied gives out code 2
退出碼 126
126 是一個特殊的退出碼,它用于表示命令或腳本因權限錯誤而未被執(zhí)行。
當你嘗試執(zhí)行沒有執(zhí)行權限的 Shell 腳本時,就會出現這個錯誤。
請注意,該退出碼只出現在沒有足夠權限的腳本或命令的“執(zhí)行”中,這與一般的權限被拒絕錯誤不同。
因此,不要把它與你之前看到的退出碼為 2
的示例混淆。在那個示例中,運行的是 ls
命令,權限問題出自它試圖執(zhí)行的目錄。而本例中權限問題來自腳本本身。
退出碼 127
這是另一個常見的退出碼。退出碼 127
指的是“未找到命令”。它通常發(fā)生在執(zhí)行的命令有錯別字或所需的可執(zhí)行文件不在 $PATH
變量中時。
例如,當我嘗試執(zhí)行一個不帶路徑的腳本時,經常會看到這個錯誤。
Script executed without the path gives "command not found" or code 127
當你想運行的可執(zhí)行文件不在 $PATH
變量中時,也會出現退出碼 127
。你可以通過 在 PATH 變量中添加命令的目錄 來糾正這種情況。
當你輸入不存在的命令時,也會得到這樣的退出碼。
Unmount is not a command, and Screenfetch is not installed, which resulted in code 127
退出碼 128+n 系列
當應用程序或命令因致命錯誤而終止或執(zhí)行失敗時,將產生 128 系列退出碼(128+n
),其中 n
為信號編號。
n
包括所有類型的終止代碼,如 SIGTERM
、SIGKILL
等。
退出碼 130 或 SIGINT
在通過終止信號 2
或按下 Ctrl+C
中斷進程時,會發(fā)出 SIGINT
(鍵盤中斷信號)。
因為終止信號是 2
,所以我們得到的退出碼是 130
(128+2)。下面的視頻演示了 lxappearance
的中斷信號。
退出碼 137 或 SIGKILL
SIGKILL
(立即終止信號)表示終止信號 9
。這是終止應用程序時最不應該使用的方法。
因為終止信號為 9
,因此我們得到的退出代碼為 137
(128+9)。
退出碼 143 或 SIGTERM
SIGTERM
是進程在未指定參數的情況下被殺死時的默認行為。
SIGTERM
的終止信號為 15
,因此該信號的退出碼為 143
(128+15)。
還有一些你以前可能不知道的終止信號,它們也有自己類似的退出碼。你可以在這里查看它們:
?? 請注意,如果進程在啟動它的同一會話中終止,這些信號可能不會出現。如果要重現這些信號,請從不同的 shell 終止。
就個人而言,信號
128
是無法重現的。
當退出碼超過了 255 會怎樣?
最新版本的 Bash 甚至保留了超過 255 的原始退出碼的值,但一般來說,如果代碼超過 255,就會被重新計算。
也就是說,代碼 256
會變成 0
,257
會變成 1
,383
會變成 127
,以此類推。為確保更好的兼容性,請將退出碼保持在 0
至 255
之間。
結語
希望你對 Linux Shell 中的退出碼有所了解。在排查各種問題時,使用它們會非常方便。
如果你要在 Shell 腳本中使用這些代碼,請確保你了解每個代碼的含義,以便更容易地排除故障。
這就是本文的全部內容。