我有以下内容:
[root@alexandra SCB]# cat test_exit.sh
#!/usr/bin/ksh
if [[ -e "test_exit.sh" ]]; then
echo "No existential crisis here"
fake_command
if [[ $? -ne 0 ]] ; then
echo "You can't run fake commands"
exit 256
fi
else
echo "WTF?"
fi
[root@alexandra SCB]# ./test_exit.sh
No existential crisis here
./test_exit.sh[7]: fake_command: not found [No such file or directory]
You can't run fake commands
[root@alexandra SCB]# echo $?
0
我的期望是我应该256
,而不是0
。
我似乎记得在某处读到KornShell中的if
条件会产生子进程。起初,我认为这可能是问题,但即使这样也无法解释。如果我对此的记忆是正确的,那么for
进程将以$? == 256
退出。所有其他出口都是隐式exit $?
,这会将256的值一直传播回原始shell。
任何人都可以解释为什么我没有看到我期待看到的256个吗?
答案 0 :(得分:3)
这是因为256超过了8位值允许的总数。如果你使用255就行了。
256 == 0模256作为2 ^ 8 = 256
答案 1 :(得分:2)
附注:最好将退出代码限制为1..127以保持与“等待”兼容。
wait命令将返回完成上一个后台进程状态的低7位。超过128的值用于表示杀死另一个进程的信号编号。