From f513b7e5e5f5314ae2d074ced1e1fa5827370bb4 Mon Sep 17 00:00:00 2001 From: Xingyu Wang Date: Thu, 3 Aug 2023 15:52:51 +0800 Subject: [PATCH] RP @lxbwolf https://linux.cn/article-16059-1.html --- ...709.0 ⭐️⭐️ What are Exit Codes in Linux.md | 92 ++++++++++--------- 1 file changed, 49 insertions(+), 43 deletions(-) rename {translated/tech => published}/20230709.0 ⭐️⭐️ What are Exit Codes in Linux.md (56%) diff --git a/translated/tech/20230709.0 ⭐️⭐️ What are Exit Codes in Linux.md b/published/20230709.0 ⭐️⭐️ What are Exit Codes in Linux.md similarity index 56% rename from translated/tech/20230709.0 ⭐️⭐️ What are Exit Codes in Linux.md rename to published/20230709.0 ⭐️⭐️ What are Exit Codes in Linux.md index 753b08be00..10c7b698fd 100644 --- a/translated/tech/20230709.0 ⭐️⭐️ What are Exit Codes in Linux.md +++ b/published/20230709.0 ⭐️⭐️ What are Exit Codes in Linux.md @@ -3,22 +3,26 @@ [#]: author: "Pranav Krishna https://itsfoss.com/author/pranav/" [#]: collector: "lkxed" [#]: translator: "lxbwolf" -[#]: reviewer: " " -[#]: publisher: " " -[#]: url: " " +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-16059-1.html" Linux 中退出码的含义 ====== -退出码或退出状态可以告诉我们最后一次执行的命令的状态。在命令结束以后,我们可以知道命令是成功完成的还是以错误结束的。 +![][0] -**其基本思想是,程序返回退出代码 `0` 时表示执行成功,没有问题。代码 `1` 或 0 以外的任何代码都被视为不成功。** +> 揭开 Linux 中退出码的神秘面纱。了解什么是退出码,以及为什么和如何使用它们。 + +退出码(退出状态)可以告诉我们最后一次执行的命令的状态。在命令结束以后,我们可以知道命令是成功完成的还是以错误结束的。 + +**其基本思想是,程序返回退出代码 `0` 时表示执行成功,没有问题。代码 `1` 或 `0` 以外的任何代码都被视为不成功。** 退出码除了 0 和 1 外还有很多值,我将在本文介绍它们。 -### Linux shell 中的各种退出码 +### Linux Shell 中的各种退出码 -我们来快速了解一下 Linux shell 中的主要退出码: +我们来快速了解一下 Linux Shell 中的主要退出码: | 退出码 | 解释 | | :- | :- | @@ -26,19 +30,19 @@ Linux 中退出码的含义 | `1` | 通用错误代码 | | `2` | 命令(或参数)使用不当 | | `126` | 权限被拒绝(或)无法执行 | -| `127` | 未找到命令,或 PATH 错误 | +| `127` | 未找到命令,或 `PATH` 错误 | | `128+n` | 命令被信号从外部终止,或遇到致命错误 | -| `130` | 通过 Ctrl+C 或 SIGINT 终止(_终止代码 2 或键盘中断_) | -| `143` | 通过 SIGTERM 终止(_默认终止_) | -| `255/*` | 退出码超过了 0-255 的范围,因此重新计算(译注:超过255后,用退出码对256取模) | +| `130` | 通过 `Ctrl+C` 或 `SIGINT` 终止(_终止代码 2 或键盘中断_) | +| `143` | 通过 `SIGTERM` 终止(_默认终止_) | +| `255/*` | 退出码超过了 0-255 的范围,因此重新计算(LCTT 译注:超过 255 后,用退出码对 256 取模) | -> 📋 `130`(SIGINT 或 `^C`)和 `143`(SIGTERM)等终止信号是非常典型的,它们属于 `128+n` 信号,其中 `n` 代表终止码。 +> 📋 `130`(`SIGINT` 或 `^C`)和 `143`(`SIGTERM`)等终止信号是非常典型的,它们属于 `128+n` 信号,其中 `n` 代表终止码。 在简单了解了退出码之后,我们来看看它们的用法。 ### 获取退出码 -前一个命令执行的退出码存储在 [特殊变量][1] `$?` 中。您可以通过运行一下命令来获取: +前一个命令执行的退出码存储在 [特殊变量][1] `$?` 中。你可以通过运行以下命令来获取: ``` echo $? @@ -46,7 +50,7 @@ echo $? 我们在所有演示中都将使用它来获取退出代码。 -请注意,_exit_ 命令支持以与前一条命令相同的退出码退出。 +请注意,`exit` 命令支持以带着前一条命令相同的退出码退出。 ### 退出码 0 @@ -64,7 +68,7 @@ echo $? 这个退出码 `0` 表示特定命令已成功执行,仅此而已。让我们再演示几个例子。 -您可以尝试 [终止一个进程][3];它也会返回代码 `0`。 +你可以尝试 [终止一个进程][3];它也会返回代码 `0`。 ``` pkill lxappearance @@ -78,21 +82,21 @@ pkill lxappearance 退出码 `1` 也很常见。它通常表示命令以一般错误结束。 -例如,在没有 sudo 权限的情况下使用 [软件包管理器][5],就会返回代码 1。在 Arch Linux 中,如果我运行下面的命令 +例如,在没有 sudo 权限的情况下使用 [软件包管理器][5],就会返回代码 `1`。在 Arch Linux 中,如果我运行下面的命令: ``` pacman -Sy ``` -它会返回 1, 表示上一条命令运行出错。 +它会返回 `1`, 表示上一条命令运行出错。 ![exit code 1 (impermissible operation resulted in this code)][6] -> 📋 如果你在基于 Ubuntu 的发行版中尝试这样做(不使用 sudo 执行 `apt update`),运行后会得到 错误码 100,表示你是在没有权限的情况下运行 `apt`。100 不是标准错误码,而是 apt 特有的错误码。 +> 📋 如果你在基于 Ubuntu 的发行版中尝试这样做(不使用 `sudo` 执行 `apt update`),运行后会得到错误码 `100`,表示你是在没有权限的情况下运行 `apt`。`100` 不是标准错误码,而是 `apt` 特有的错误码。 -虽然这是一般的理解,但我们也可以将其解释为 "不被允许的操作"。 +虽然这是一般的理解,但我们也可以将其解释为 “不被允许的操作”。 -除以 0 等操作也会返回错误码 1。 +除以 `0` 等操作也会返回错误码 `1`。 ![Division by zero results in code 1][7] @@ -110,7 +114,7 @@ grep --z file.txt ![Invalid argument resulted in exit code 2][8] -当权限被拒绝时,比如访问 /root 文件夹,就会出现错误码 2。 +当权限被拒绝时,比如访问 `/root` 文件夹,就会出现错误码 `2`。 ![Permission denied gives out code 2][9] @@ -118,23 +122,23 @@ grep --z file.txt 126 是一个特殊的退出码,它用于表示命令或脚本因权限错误而未被执行。 -当你尝试执行没有执行权限的 shell 脚本时,就会出现这个错误。 +当你尝试执行没有执行权限的 Shell 脚本时,就会出现这个错误。 ![][10] -请注意,该退出码只出现在没有足够权限的脚本或命令的"_执行_"中,这与一般的**权限被拒绝**错误不同。 +请注意,该退出码只出现在没有足够权限的脚本或命令的“_执行_”中,这与一般的**权限被拒绝**错误不同。 -因此,不要把它与你之前看到的退出码为 2 的示例混淆。在那个示例中,运行的是 ls 命令,权限问题出自它试图执行的目录。而本例中权限问题来自脚本本身。 +因此,不要把它与你之前看到的退出码为 `2` 的示例混淆。在那个示例中,运行的是 `ls` 命令,权限问题出自它试图执行的目录。而本例中权限问题来自脚本本身。 ### 退出码 127 -这是另一个常见的退出码。退出码 127 指的是"[未找到命令][11]"。它通常发生在执行的命令有错别字或所需的可执行文件不在 $PATH 变量中时。 +这是另一个常见的退出码。退出码 `127` 指的是“[未找到命令][11]”。它通常发生在执行的命令有错别字或所需的可执行文件不在 `$PATH` 变量中时。 例如,当我尝试执行一个不带路径的脚本时,经常会看到这个错误。 ![Script executed without the path gives "command not found" or code 127][12] -当你想运行的可执行文件不在 `$PATH` 变量中时,也会出现退出码 127。你可以通过 [在 PATH 变量中添加父目录][13] 来纠正这种情况。 +当你想运行的可执行文件不在 `$PATH` 变量中时,也会出现退出码 `127`。你可以通过 [在 PATH 变量中添加命令的目录][13] 来纠正这种情况。 当你输入不存在的命令时,也会得到这样的退出码。 @@ -142,54 +146,56 @@ grep --z file.txt ### 退出码 128+n 系列 -当应用程序或命令因致命错误而终止或执行失败时,将产生 128 系列退出码 (128+n),其中 n 为信号编号。 +当应用程序或命令因致命错误而终止或执行失败时,将产生 128 系列退出码(`128+n`),其中 `n` 为信号编号。 `n` 包括所有类型的终止代码,如 `SIGTERM`、`SIGKILL` 等。 #### 退出码 130 或 SIGINT -在通过终止信号 2 或 按下 Ctrl+C 中断进程时,会发出 `SIGINT`(键盘中断信号)。 +在通过终止信号 `2` 或按下 `Ctrl+C` 中断进程时,会发出 `SIGINT`(键盘中断信号)。 -因为终止信号是 2,所以我们得到的退出码是 130 (128+2)。下面的视频演示了 `lxappearance` 的中断信号。 +因为终止信号是 `2`,所以我们得到的退出码是 `130`(128+2)。下面的视频演示了 `lxappearance` 的中断信号。 -