Bash Shell 脚本/退出状态
当一个进程完成时,它会返回一个小的非负整数,称为它的退出状态或返回状态给操作系统。按照惯例,如果它成功完成,则返回零,如果它失败并出现错误,则返回一个正数。(这种方法允许使用不同的正数来区分多个不同的错误。)Bash 脚本可以通过使用内置命令exit
来遵守此惯例。以下命令
exit 4
终止 shell 脚本,返回退出状态为 4,表示某种错误。当没有指定退出状态时(无论是由于exit
在没有参数的情况下运行,还是由于脚本在没有调用exit
的情况下结束),脚本将返回它运行的最后一个命令的退出状态。
退出状态的一种使用方法是使用 Bash 运算符&&
(“与”)和||
(“或”)。如果两个命令用&&
分隔,则首先运行左侧的命令,只有第一个命令成功时才会运行右侧的命令。相反,如果它们用||
分隔,则只有左侧命令失败时才会运行右侧的命令。
例如,假设我们要删除文件file.txt
并将其重新创建为一个空文件。我们可以使用常见的 Unix 工具rm
(“移除”)来删除它,并使用常见的 Unix 工具touch
来重新创建它;所以,我们可以这样写
rm file.txt
touch file.txt
但实际上,如果rm
失败,我们不想运行touch
:如果我们最初未能删除文件,我们不想重新创建它。所以,我们可以改写成这样
rm file.txt && touch file.txt
这与之前相同,只是它不会尝试运行touch
,除非rm
成功。
第三个类似布尔运算符!
(“非”)会反转命令的退出状态。例如,此命令
! rm file.txt
等效于rm file.txt
,只是它在rm
表示失败时会表示成功,反之亦然。(当退出状态用作实际退出状态时,这通常没有用,表示成功或失败,但我们很快就会看到一些扩展的退出状态用法,其中“非”操作更有用。)
命令的退出状态(简而言之)可以通过$?
访问。当需要区分多个不同的失败状态时,这会很有用;例如,grep
命令(搜索文件中与指定模式匹配的行)在找到匹配项时返回 0,在没有找到匹配项时返回 1,在发生真正的错误时返回 2。