bash 脚本末尾的退出代码

Bus*_*ted 31 bash shell-script exit exit-status

我对 bash 脚本末尾的退出代码的含义感到困惑:我知道退出代码 0 表示它成功完成,并且还有更多的退出代码编号(如果我没记错的话,是 127?)

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

ilk*_*chu 32

内置命令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 $?
Run Code Online (Sandbox Code Playgroud)

虽然这应该打印一个 0:

sh -c "false; exit 0" ; echo $?
Run Code Online (Sandbox Code Playgroud)

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

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


Gil*_*il' 24

0 表示成功,正整数表示失败。有 255 种不同的错误代码,但保留值 126 及以上以指示程序无法启动(126 或 127)或被信号终止(129 及以上)。请参阅进程终止时的默认退出代码?而且我可以在bash函数/脚本使用什么样的回报/退出值?想要查询更多的信息。

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

#!/bin/sh
somecommand
Run Code Online (Sandbox Code Playgroud)

返回 的退出状态somecommand,而

#!/bin/sh
somecommand
exit 0
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
somecommand
true
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
exit 3
exit 0
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
}
exit 0
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
set -e
somecommand
exit 0
Run Code Online (Sandbox Code Playgroud)