bash脚本末尾的退出代码


22

我对bash脚本结尾处的退出代码的含义感到困惑:我知道退出代码0表示成功完成了退出,而且还有更多的退出代码编号(如果我没记错的话,为127)。

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


2
如果脚本以结束exit 0,则无论脚本内部发生什么,它都将以退出代码0退出。
Hatclock

@Hatclock为什么您没有将完整的答案发布在答案中?作为一个评论我不能将其标记,而且我不认为你假上网点回答只是一个想法......(用于快速回复荣誉)(右?)
猛击

1
我在手机上的火车站,我真的不喜欢在手机上输入太多内容。ilkkachu似乎有一个不错的答案!
Hatclock


2
@Hatclock不,一点也不。如果脚本以结束exit 0,则只有在执行了最后一条指令后,脚本才会以代码0退出。exit 0脚本结尾处的唯一影响是返回0,而不是前一条指令的状态。
吉尔(Gilles)“所以

Answers:


22

内置命令exit退出外壳程序(来自Bash的参考资料):

exit [n]
退出外壳程序,将状态n返回到外壳程序的父级。如果省略n,则退出状态为最后执行的命令的退出状态。在外壳终止之前,将执行EXIT上的所有陷阱。

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

当然,您更常exit从内部使用if脚本来在中间结束脚本。

这些应显示1($?包含上一条命令返回的退出代码):

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

虽然这应该打印一个0:

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

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

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


太酷了,我不知道8位出口代码的编号。谢谢!
2016年

请注意,当一个进程被杀死时,它不会以退出代码> 127退出$?。在这种情况下,只是一些shell设置为128 + signum。请参阅进程终止时的默认退出代码?有关详细信息。
斯特凡Chazelas

exit 0如果执行了退出操作,则只会返回0。(它可能会通过其他路线退出)。
ctrl-alt-delor

18

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

Shell脚本的退出状态是该脚本执行的最后一个命令的退出状态。所以举个例子

#!/bin/sh
somecommand

返回的退出状态somecommand,而

#!/bin/sh
somecommand
exit 0

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

#!/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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.