为啥许多 init.d 脚本以“exit $?”结尾?

Posted

技术标签:

【中文标题】为啥许多 init.d 脚本以“exit $?”结尾?【英文标题】:Why do many init.d scripts end in "exit $?"?为什么许多 init.d 脚本以“exit $?”结尾? 【发布时间】:2014-10-11 06:09:58 【问题描述】:

我在 CentOS 6.5 的 init.d 脚本中看到了很多奇怪的怪癖,但我在大多数这些脚本的结尾看到的一种模式是

case "$1" in
    # ... commands here
esac
exit $?

这里“exit $?”的作用是什么?

【问题讨论】:

【参考方案1】:

它使脚本将最后一个有效命令的返回码返回给调用 init 系统。每当一个命令退出时,它的返回码都会被 shell 存储在$? 中。

实际上并没有必要明确指定$?,但脚本编写者可能只是将其包含在内以明确其打算做什么。

退出:退出 [n]

退出外壳。

退出shell,状态为N。如果省略N,退出状态 是最后执行的命令。

我也希望你不是指eend $? of OpenRC

结束 retval [字符串]

如果 retval 不等于 0,则使用 eerror 和 !! 输出字符串在行尾的方>括号中。否则在行尾的方括号中输出 ok。返回 retval 的值。

见source。

【讨论】:

所以是为了代码清晰? (一个 sn-p 说“不要覆盖退出代码,因为我依赖它”?) 这可能是一回事。如果它在脚本的末尾,exit 也可以省略,因为默认情况下 shell 会返回 $? 的任何值。

以上是关于为啥许多 init.d 脚本以“exit $?”结尾?的主要内容,如果未能解决你的问题,请参考以下文章

为啥shell脚本exit后,当前进程没有终止?

理解Linux系统/etc/init.d目录和/etc/rc.local脚本

shell:为啥循环内调用脚本,遇到exit会退出循环?

linux 下xinetd和/etc/init.d里的服务不一样吗?为啥要设置这两个?

mfschunkserver安装脚本

mfsclient安装脚本