如何让 Bash 以给定的退出代码退出

如何让 Bash 以给定的退出代码退出

为什么下面打印0?我预计它会打印 1234。

$ bash -c exit 1234
$ echo $?

答案1

bash -c exit 1234

使用单独的参数-cexit和运行 bash 1234-c消耗紧随其后的参数,因此 bashexit仅运行;1234用作第一个位置参数($0shell 的名称)。

要让 bash 以给定代码退出,您需要引用整个命令:

bash -c "exit 1234"

请注意,bash 退出状态限制为 0-255,因此这会产生 210 (1234 % 256) 的退出状态。

答案2

即使您将代码修复为运行而不是单独运行,也不能使用bash's内置函数,因为它会自行将值截断为 8 位:exitexit 1234exitbash

$ strace -e exit_group bash -c 'exit 1234'
exit_group(210)                         = ?

您需要在同一进程中执行另一个命令,该命令可以以任意值退出:

$ strace -e exit_group bash -c 'exec perl -e "exit 1234"'
exit_group(1234)                        = ?
$ strace -e exit_group bash -c 'exec zsh -c "exit 1234"'
exit_group(1234)                        = ?

无论如何,请注意,某些系统(例如 Linux)不允许父进程访问该退出状态的完整值,即使使用 API或POSIX 要求不截断它的waitid()SIGCHLD处理程序也是如此。sigaction()

有关详细信息,请访问:

相关内容