Linux 中退出碼的含義
退出碼(退出狀態)可以告訴我們最後一次執行的命令的狀態。在命令結束以後,我們可以知道命令是成功完成的還是以錯誤結束的。
其基本思想是,程序返回退出代碼 0
時表示執行成功,沒有問題。代碼 1
或 0
以外的任何代碼都被視為不成功。
退出碼除了 0 和 1 外還有很多值,我將在本文介紹它們。
Linux Shell 中的各種退出碼
我們來快速了解一下 Linux Shell 中的主要退出碼:
退出碼 | 解釋 |
---|---|
0 |
命令成功執行 |
1 |
通用錯誤代碼 |
2 |
命令(或參數)使用不當 |
126 |
許可權被拒絕(或)無法執行 |
127 |
未找到命令,或 PATH 錯誤 |
128+n |
命令被信號從外部終止,或遇到致命錯誤 |
130 |
通過 Ctrl+C 或 SIGINT 終止(終止代碼 2 或鍵盤中斷) |
143 |
通過 SIGTERM 終止(默認終止) |
255/* |
退出碼超過了 0-255 的範圍,因此重新計算(LCTT 譯註:超過 255 後,用退出碼對 256 取模) |
?
130
(SIGINT
或^C
)和143
(SIGTERM
)等終止信號是非常典型的,它們屬於128+n
信號,其中n
代表終止碼。
在簡單了解了退出碼之後,我們來看看它們的用法。
獲取退出碼
前一個命令執行的退出碼存儲在 特殊變數 $?
中。你可以通過運行以下命令來獲取:
echo $?
我們在所有演示中都將使用它來獲取退出代碼。
請注意,exit
命令支持以帶著前一條命令相同的退出碼退出。
退出碼 0
退出碼 0
表示命令執行無誤,這是完成命令的理想狀態。
例如,我們運行這樣一條基本命令
neofetch
echo $?
這個退出碼 0
表示特定命令已成功執行,僅此而已。讓我們再演示幾個例子。
你可以嘗試 終止一個進程;它也會返回代碼 0
。
pkill lxappearance
查看文件內容也會返回退出碼 0,這僅意味著 cat
命令執行成功。
退出碼 1
退出碼 1
也很常見。它通常表示命令以一般錯誤結束。
例如,在沒有 sudo 許可權的情況下使用 軟體包管理器,就會返回代碼 1
。在 Arch Linux 中,如果我運行下面的命令:
pacman -Sy
它會返回 1
, 表示上一條命令運行出錯。
? 如果你在基於 Ubuntu 的發行版中嘗試這樣做(不使用
sudo
執行apt update
),運行後會得到錯誤碼100
,表示你是在沒有許可權的情況下運行apt
。100
不是標準錯誤碼,而是apt
特有的錯誤碼。
雖然這是一般的理解,但我們也可以將其解釋為 「不被允許的操作」。
除以 0
等操作也會返回錯誤碼 1
。
退出碼 2
這個退出碼出現在當執行的命令有語法錯誤時。濫用命令參數也會導致此錯誤。
一般來說,它表示由於使用不當,命令無法執行。
例如,我在一個本應只有一個連字元的選項上添加了兩個連字元,那麼此時會出現退出碼 2。
grep --z file.txt
當許可權被拒絕時,比如訪問 /root
文件夾,就會出現錯誤碼 2
。
退出碼 126
126 是一個特殊的退出碼,它用於表示命令或腳本因許可權錯誤而未被執行。
當你嘗試執行沒有執行許可權的 Shell 腳本時,就會出現這個錯誤。
請注意,該退出碼只出現在沒有足夠許可權的腳本或命令的「執行」中,這與一般的許可權被拒絕錯誤不同。
因此,不要把它與你之前看到的退出碼為 2
的示例混淆。在那個示例中,運行的是 ls
命令,許可權問題出自它試圖執行的目錄。而本例中許可權問題來自腳本本身。
退出碼 127
這是另一個常見的退出碼。退出碼 127
指的是「未找到命令」。它通常發生在執行的命令有錯別字或所需的可執行文件不在 $PATH
變數中時。
例如,當我嘗試執行一個不帶路徑的腳本時,經常會看到這個錯誤。
當你想運行的可執行文件不在 $PATH
變數中時,也會出現退出碼 127
。你可以通過 在 PATH 變數中添加命令的目錄 來糾正這種情況。
當你輸入不存在的命令時,也會得到這樣的退出碼。
退出碼 128+n 系列
當應用程序或命令因致命錯誤而終止或執行失敗時,將產生 128 系列退出碼(128+n
),其中 n
為信號編號。
n
包括所有類型的終止代碼,如 SIGTERM
、SIGKILL
等。
退出碼 130 或 SIGINT
在通過終止信號 2
或按下 Ctrl+C
中斷進程時,會發出 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 腳本中使用這些代碼,請確保你了解每個代碼的含義,以便更容易地排除故障。
這就是本文的全部內容。如有遺漏,請在評論區告訴我。
(題圖:MJ/719ff711-1b9f-4aa9-a82e-980704acbdd8)
via: https://itsfoss.com/linux-exit-codes/
作者:Pranav Krishna 選題:lkxed 譯者:lxbwolf 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive