Linux中國

Linux 中退出碼的含義

揭開 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, 表示上一條命令運行出錯。

exit code 1 (impermissible operation resulted in this code)

? 如果你在基於 Ubuntu 的發行版中嘗試這樣做(不使用 sudo 執行 apt update),運行後會得到錯誤碼 100,表示你是在沒有許可權的情況下運行 apt。100 不是標準錯誤碼,而是 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 包括所有類型的終止代碼,如 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

本文由 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中國

    Linux中國

    捐贈 Let's Encrypt,共建安全的互聯網

    隨著 Mozilla、蘋果和谷歌對沃通和 StartCom 這兩家 CA 公司處罰落定,很多使用這兩家 CA 所簽發證書的網站紛紛尋求新的證書籤發商。有一個非盈利組織可以為大家提供了免費、可靠和安全的 SSL 證書服務,這就是 Let's Encrypt 項目。現在,它需要您的幫助
    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...