Linux中國

Linux 中退出碼的含義

揭開 Linux 中退出碼的神秘面紗。了解什麼是退出碼,以及為什麼和如何使用它們。

退出碼(退出狀態)可以告訴我們最後一次執行的命令的狀態。在命令結束以後,我們可以知道命令是成功完成的還是以錯誤結束的。

其基本思想是,程序返回退出代碼 0 時表示執行成功,沒有問題。代碼 10 以外的任何代碼都被視為不成功。

退出碼除了 0 和 1 外還有很多值,我將在本文介紹它們。

Linux Shell 中的各種退出碼

我們來快速了解一下 Linux Shell 中的主要退出碼:

退出碼 解釋
0 命令成功執行
1 通用錯誤代碼
2 命令(或參數)使用不當
126 許可權被拒絕(或)無法執行
127 未找到命令,或 PATH 錯誤
128+n 命令被信號從外部終止,或遇到致命錯誤
130 通過 Ctrl+CSIGINT 終止(終止代碼 2 或鍵盤中斷
143 通過 SIGTERM 終止(默認終止
255/* 退出碼超過了 0-255 的範圍,因此重新計算(LCTT 譯註:超過 255 後,用退出碼對 256 取模)

? 130SIGINT^C)和 143SIGTERM)等終止信號是非常典型的,它們屬於 128+n 信號,其中 n 代表終止碼。

在簡單了解了退出碼之後,我們來看看它們的用法。

獲取退出碼

前一個命令執行的退出碼存儲在 特殊變數 $? 中。你可以通過運行以下命令來獲取:

echo $?

我們在所有演示中都將使用它來獲取退出代碼。

請注意,exit 命令支持以帶著前一條命令相同的退出碼退出。

退出碼 0

退出碼 0 表示命令執行無誤,這是完成命令的理想狀態。

例如,我們運行這樣一條基本命令

neofetch 

echo $?

這個退出碼 0 表示特定命令已成功執行,僅此而已。讓我們再演示幾個例子。

你可以嘗試 終止一個進程;它也會返回代碼 0

pkill lxappearance

查看文件內容也會返回退出碼 0,這意味著 cat 命令執行成功。

退出碼 1

退出碼 1 也很常見。它通常表示命令以一般錯誤結束。

例如,在沒有 sudo 許可權的情況下使用 軟體包管理器,就會返回代碼 1。在 Arch Linux 中,如果我運行下面的命令:

pacman -Sy

它會返回 1, 表示上一條命令運行出錯。

exit code 1 (impermissible operation resulted in this code)

? 如果你在基於 Ubuntu 的發行版中嘗試這樣做(不使用 sudo 執行 apt update),運行後會得到錯誤碼 100,表示你是在沒有許可權的情況下運行 apt100 不是標準錯誤碼,而是 apt 特有的錯誤碼。

雖然這是一般的理解,但我們也可以將其解釋為 「不被允許的操作」。

除以 0 等操作也會返回錯誤碼 1

Division by zero results in code 1

退出碼 2

這個退出碼出現在當執行的命令有語法錯誤時。濫用命令參數也會導致此錯誤。

一般來說,它表示由於使用不當,命令無法執行。

例如,我在一個本應只有一個連字元的選項上添加了兩個連字元,那麼此時會出現退出碼 2。

grep --z file.txt

Invalid argument resulted in exit code 2

當許可權被拒絕時,比如訪問 /root 文件夾,就會出現錯誤碼 2

Permission denied gives out code 2

退出碼 126

126 是一個特殊的退出碼,它用於表示命令或腳本因許可權錯誤而未被執行。

當你嘗試執行沒有執行許可權的 Shell 腳本時,就會出現這個錯誤。

請注意,該退出碼只出現在沒有足夠許可權的腳本或命令的「執行」中,這與一般的許可權被拒絕錯誤不同。

因此,不要把它與你之前看到的退出碼為 2 的示例混淆。在那個示例中,運行的是 ls 命令,許可權問題出自它試圖執行的目錄。而本例中許可權問題來自腳本本身。

退出碼 127

這是另一個常見的退出碼。退出碼 127 指的是「未找到命令」。它通常發生在執行的命令有錯別字或所需的可執行文件不在 $PATH 變數中時。

例如,當我嘗試執行一個不帶路徑的腳本時,經常會看到這個錯誤。

Script executed without the path gives "command not found" or code 127

當你想運行的可執行文件不在 $PATH 變數中時,也會出現退出碼 127。你可以通過 在 PATH 變數中添加命令的目錄 來糾正這種情況。

當你輸入不存在的命令時,也會得到這樣的退出碼。

Unmount is not a command, and Screenfetch is not installed, which resulted in code 127

退出碼 128+n 系列

當應用程序或命令因致命錯誤而終止或執行失敗時,將產生 128 系列退出碼(128+n),其中 n 為信號編號。

n 包括所有類型的終止代碼,如 SIGTERMSIGKILL 等。

退出碼 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 會變成 0257 會變成 1383 會變成 127,以此類推。為確保更好的兼容性,請將退出碼保持在 0255 之間。

結語

希望你對 Linux Shell 中的退出碼有所了解。在排查各種問題時,使用它們會非常方便。

如果你要在 Shell 腳本中使用這些代碼,請確保你了解每個代碼的含義,以便更容易地排除故障。

這就是本文的全部內容。如有遺漏,請在評論區告訴我。

(題圖:MJ/719ff711-1b9f-4aa9-a82e-980704acbdd8)

via: https://itsfoss.com/linux-exit-codes/

作者:Pranav Krishna 選題:lkxed 譯者:lxbwolf 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國