我正在尝试学习 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) 两个变量都使用程序的保留退出状态代码,那么这两个变量会做什么?
或者
如果两个变量都使用随机数来达到此目的。
答案1
一般来说,任何进程的退出状态由 POSIX 定义为 8 位(无符号)整数值,因此可能的值在 0 到 255 之间(包括 0 和 255)。
WEXITSTATUS(stat_val)
_exit()
[This] 宏计算子进程传递给或的状态参数的低位 8 位exit()
,或者子进程从 返回的值main()
。等等(3p)C 标准指定了两个常量
EXIT_SUCCESS
和EXIT_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