什么是 Linux 退出状态以及所有状态列表

什么是 Linux 退出状态以及所有状态列表

我正在尝试学习 Linux bash 脚本,并且我阅读了http://tldp.org我在网站上看到了某种日志清除脚本,我注意到有些东西被用作退出状态。我在下面给出了文章中的一些脚本片段。

#!/bin/bash
# Cleanup, version 3

#  Warning:
#  -------
#  This script uses quite a number of features that will be explained
#+ later on.
#  By the time you've finished the first half of the book,
#+ there should be nothing mysterious about it.

LOG_DIR=/var/log
ROOT_UID=0     # Only users with $UID 0 have root privileges.
LINES=50       # Default number of lines saved.
E_XCD=86       # Can't change directory?
E_NOTROOT=87   # Non-root exit error.

如果 E_NOTROOT(86) 和 E_XCD(87) 两个变量都使用程序的保留退出状态代码,那么这两个变量会做什么?

或者

如果两个变量都使用随机数来达到此目的。

参考:http://tldp.org/LDP/abs/html/abs-guide.html

答案1

一般来说,任何进程的退出状态由 POSIX 定义为 8 位(无符号)整数值,因此可能的值在 0 到 255 之间(包括 0 和 255)。

WEXITSTATUS(stat_val)_exit()[This] 宏计算子进程传递给或的状态参数的低位 8 位exit(),或者子进程从 返回的值main()等等(3p)

C 标准指定了两个常量EXIT_SUCCESSEXIT_FAILURE,可以传递给 exit() 以分别指示成功或不成功终止。退出(3)

按照惯例,EXIT_SUCCESS等于零并且所有非零值都被视为错误的符号。

然而,包括 Bash 在内的类 POSIX shell 保留了一系列高退出状态供内部使用,以表明被调用命令中出现了问题,而该命令没有机会返回显式退出状态(bash手册):

对于 shell 而言,以零退出状态退出的命令已成功。退出状态为零表示成功。非零退出状态表示失败。当命令因致命信号 N 而终止时,bash 使用 128+N 的值作为退出状态。如果未找到命令,则为执行该命令而创建的子进程将返回状态 127。如果找到命令但不可执行,则返回状态为 126。

实际上,1 到 125 之间的任何值都可以用于以特定于程序的方式指示错误。正如 @mosvy 在评论中暗示的那样,BSD 的努力标准化一些有意义的退出代码,但它从未变得普遍。这些统一的退出代码从 64 开始,将低于该值的任何值保留给特定于程序的使用。最高的“标准化”值是 78,因此很明显,示例中提到的值纯粹是任意的特定于程序的代码。

答案2

每个执行都有一个退出状态。一般来说,零表示正常,非零表示错误。该值不会自然地显示在标准输出中。您可以echo $?在每个执行的命令后看到该值的输入。

例如,如果您输入:

mkdir test;echo $?如果您有正确的权限,您将创建该目录,然后您将看到一个零。

但是如果您编写 mkdir testing/test;echo $?具有正确的权限但没有“测试”子目录,您将看到错误消息,然后看到“1”。

这是 GNU/Linux 中非常重要的工具,因为命令可以互连。并且(仅作为示例)如果您使用双与号来连接命令,则仅当第一个命令在退出时具有零值时才会执行第二个命令。连接命令的方法有很多种。要了解更多信息,只需输入man bash

相关内容