为何回声$?返回不同于预期的值?

时间:2018-06-18 00:26:32

标签: bash error-handling compiler-errors echo exit

我知道echo $?会返回上一个进程的退出状态。 在我的程序中,如果我的程序以状态代码0结束,则会获得0。但是,当程序结束时,状态代码-1 echo $?会显示255。 StackOverflow上有类似的问题,但没有解释为什么会这样。另外,其中一个答案表示通常高于128的值表示一些错误和负退出代码。例如,147 - 我们可以通过从147减去128,128 - 147 = -19来获得真正的退出代码,因此退出代码是-19。 在我的电脑中,我发现256是这个数字。例如255 - 256 = -1,这是我的程序返回的。 为什么在不同的系统上这些数字会变化128,256,为什么他们不能打印原始的否定代码而不是将这些数字添加到原始退出状态代码。

1 个答案:

答案 0 :(得分:2)

由于历史原因,退出代码被解释为无符号的单字节值。 "正常"错误代码为正(< 127),而"异常"错误代码(例如通过终止信号产生的错误代码)是否定的(> = 128)。

尝试在sleep 10命令上按Ctrl-C。退出代码是130。

127是未找到"命令的结果"。

建议不要明确使用否定错误代码。

有关详细信息,请查看wait()手册页(man 2 wait),特别是WFEXITED()和朋友。

  

WEXITSTATUS(状态)

     

返回子项的退出状态。这包括状态参数的最低有效8位   在调用exit(3)或_exit(2)时指定的子项,或者作为main()中的return语句的参数。这个宏应该   只有在WIFEXITED返回true时才被使用。

(强调补充)