bash 脚本末尾的退出代码

bash 脚本末尾的退出代码

我对 bash 脚本末尾的退出代码的含义感到困惑:我知道退出代码 0 意味着它成功完成,并且还有更多退出代码数字(如果我没有记错的话,为 127?)

我的问题是,当在脚本末尾看到退出代码 0 时,即使脚本失败,它是否会强制退出代码为 0,还是有其他含义?

答案1

内置命令exit退出 shell(从Bash 的参考):

exit [n]
退出 shell,将状态 n 返回给 shell 的父级。如果省略 n,则退出状态为最后执行的命令的状态。 EXIT 上的任何陷阱都会在 shell 终止之前执行。

运行到文件末尾也会退出,返回最后一个命令的返回代码,所以是的,finalexit 0将使脚本以成功状态退出,无论前面命令的退出状态如何。 (也就是说,假设脚本到达最后exit。)在脚本末尾,您还可以使用true:来获取退出代码为零。

当然,更常见的是,您会使用exitfrom inside anif在中间结束脚本。

这些应该打印 1 ($?包含上一个命令返回的退出代码):

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

虽然这应该打印 0:

sh -c "false; exit 0" ; echo $?

我不确定执行时脚本“失败”的概念是否exit有意义,因为脚本运行的某些命令很可能会失败,但脚本本身会成功。由剧本作者来决定什么是成功的,什么是不成功的。

此外,退出代码的标准范围是 0..255。 shell 使用 127 以上的代码来指示由信号终止的进程,但它们可以以通常的方式返回。系统wait调用实际上返回一个更宽的值,其余的包含操作系统设置的状态位。

答案2

0 表示成功,正整数表示失败。有 255 种不同的错误代码,但值 126 及以上被保留,以指示程序无法启动(126 或 127)或被信号终止(129 及以上)。看进程终止时的默认退出代码?我可以在 bash 函数/脚本中使用哪些返回/退出值?了解更多信息。

shell 脚本的退出状态是脚本执行的最后一个命令的退出状态。例如

#!/bin/sh
somecommand

返回 的退出状态somecommand,而

#!/bin/sh
somecommand
exit 0

无论somecommand返回什么,都返回 0。第二个脚本也可以写成

#!/bin/sh
somecommand
true

放在exit 0脚本末尾并不一定会导致它返回 0。这只会使它在到达脚本末尾时返回 0。例如,以下脚本始终返回 3:

#!/bin/sh
exit 3
exit 0

除了显示有关语法错误的消息之外,以下脚本还始终返回错误代码:

#!/bin/sh
}
exit 0

以下脚本根据其第一个参数返回 1 或 0:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

以下脚本返回 的状态somecommand,因为如果失败set -e会导致脚本退出:somecommand

#!/bin/sh
set -e
somecommand
exit 0

相关内容