我对 bash 脚本末尾的退出代码的含义感到困惑:我知道退出代码 0 意味着它成功完成,并且还有更多退出代码数字(如果我没有记错的话,为 127?)
我的问题是,当在脚本末尾看到退出代码 0 时,即使脚本失败,它是否会强制退出代码为 0,还是有其他含义?
答案1
内置命令exit
退出 shell(从Bash 的参考):
exit [n]
退出 shell,将状态 n 返回给 shell 的父级。如果省略 n,则退出状态为最后执行的命令的状态。 EXIT 上的任何陷阱都会在 shell 终止之前执行。
运行到文件末尾也会退出,返回最后一个命令的返回代码,所以是的,finalexit 0
将使脚本以成功状态退出,无论前面命令的退出状态如何。 (也就是说,假设脚本到达最后exit
。)在脚本末尾,您还可以使用true
或:
来获取退出代码为零。
当然,更常见的是,您会使用exit
from 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