如何在shell条件中设置退出代码?

时间:2011-03-15 23:37:11

标签: shell scripting conditional ksh

我有以下内容:

[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个吗?

2 个答案:

答案 0 :(得分:3)

这是因为256超过了8位值允许的总数。如果你使用255就行了。

256 == 0模256作为2 ^ 8 = 256

答案 1 :(得分:2)

附注:最好将退出代码限制为1..127以保持与“等待”兼容。

wait命令将返回完成上一个后台进程状态的低7位。超过128的值用于表示杀死另一个进程的信号编号。