我有一个脚本(run-docker-container.sh)调用另一个脚本(create-docker-container.sh)。 create-docker-container 针对 docker 远程 api 执行curl 脚本并返回 http 代码,如果成功则返回零。创建脚本因此返回
echo $RVAL
exit $RVAL
在我的测试中, $RVAL 的值为 404,这是我对这个问题感兴趣的值。
在我的 run-docker-container 脚本中,我有以下几行
create-docker-container.sh $CONTAINER_NAME $CONTAINER_SETTINGS
rval=$?
echo $rval
if [ $rval -eq 404 ]; then
...
fi
尽管 create 似乎以 404 退出,但我得到的值$?
是 148,因此我的条件处理没有被调用。为什么会这样以及如何正确从脚本中获取退出代码?
答案1
由于历史原因,进程的退出状态是一个 8 位数字。您传递给的数字exit
会以 256 (2⁸) 为模进行减少。
此外,值 126 及以上具有常规含义,表示启动程序失败(126 或 127)或被信号终止的程序(128 及以上)。因此,虽然您可以返回此类值,但除非您想模拟这些条件,否则不应该返回此类值。
规则是返回 0 表示成功,返回一些其他值来指示错误。这是一条规则,因为许多工具将 0 解释为成功:条件命令(例如if
和while
)、出现错误时中止的工具(例如set -e
和 makefile 下的 shell 脚本等)。
关于错误,最常见的约定是在任何错误时返回 1,或在任何错误时返回 2。第三个最常见的约定是在预期失败时返回 1(例如,搜索命令没有找到任何内容),在意外失败时返回 2(例如,要搜索的文件不存在)。如果您需要将 HTTP 错误代码映射到退出状态,则可以使用 1-125 范围(200 成功映射到 0),对此没有标准。