我对bash脚本结尾处的退出代码的含义感到困惑:我知道退出代码0表示成功完成了退出,而且还有更多的退出代码编号(如果我没记错的话,为127)。
我的问题是关于在脚本末尾看到退出代码0时,即使脚本失败还是会强制退出代码为0还是有其他含义?
exit 0
,则只有在执行了最后一条指令后,脚本才会以代码0退出。exit 0
脚本结尾处的唯一影响是返回0,而不是前一条指令的状态。
我对bash脚本结尾处的退出代码的含义感到困惑:我知道退出代码0表示成功完成了退出,而且还有更多的退出代码编号(如果我没记错的话,为127)。
我的问题是关于在脚本末尾看到退出代码0时,即使脚本失败还是会强制退出代码为0还是有其他含义?
exit 0
,则只有在执行了最后一条指令后,脚本才会以代码0退出。exit 0
脚本结尾处的唯一影响是返回0,而不是前一条指令的状态。
Answers:
内置命令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
系统调用实际上返回更宽的值,与由操作系统设置的含有其余状态位。
$?
。在这种情况下,只是一些shell设置为128 + signum。请参阅进程终止时的默认退出代码?有关详细信息。
exit 0
如果执行了退出操作,则只会返回0。(它可能会通过其他路线退出)。
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
exit 0
,则无论脚本内部发生什么,它都将以退出代码0退出。