`exit;` 和 `exit $?;` 之间的区别

`exit;` 和 `exit $?;` 之间的区别

这两个命令有什么区别:

   exec "$(dirname "$0")/suman-shell";
   exit $?;

   exec "$(dirname "$0")/suman-shell";
   exit;

$?第一种情况是多余的吗?

答案1

您的脚本中有几个缺陷:

exec "$(dirname "$0")/suman-shell";
exit $?;
  • 第一个是结尾的分号是多余的。它们无害,但没有任何作用。行尾已经是分隔符,分号用作单行上多个命令之间的分隔符。它们的存在稍微恶化了代码的可读性。

  • 第二个exit默认返回前一个命令的退出状态,因此$?尽管表明了意图,但说明是多余的。

  • 第三个是exec正常情况下永远不会返回1,因此exit调用一开始就没有到达,也是多余的。

1返回的唯一情况exec是空参数、损坏的重定向或execfailbash 选项集(不是默认设置)。第一个和第二个在这里不适用,并且没有证据表明第三个在这里适用。

答案2

help exit

以状态 N 退出 shell。如果省略 N,则退出状态为最后执行的命令的状态。

所以是的,这是完全多余的。

答案3

严格来说,当包含数字时exit和当包含数字时是有区别的exit $?$IFS你忘记引用它$?,因此调用 split+glob 运算符

$ bash -c 'IFS=123; false; exit $?'; echo "$?"
bash: line 0: exit: : numeric argument required
2
$ bash -c 'IFS=123; false; exit'; echo "$?"
1
$ bash -c 'IFS=123; false; exit "$?"'; echo "$?"
1
$ bash -c "exit ''"
bash: line 0: exit: : numeric argument required

在第一种情况下,由于$?未加引号,因此会受到分词的影响。使用$IFScontains时, ( )1的内容被拆分为 中的一个空参数,因此就好像您调用了.$?1bashexit ''

相关内容