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

Ale*_*lls 2 bash shell-script exit exit-status

这两个命令有什么区别:

   exec "$(dirname "$0")/suman-shell";
   exit $?;
Run Code Online (Sandbox Code Playgroud)

   exec "$(dirname "$0")/suman-shell";
   exit;
Run Code Online (Sandbox Code Playgroud)

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

Sté*_*las 6

严格来说,当您忘记引用数字并因此调用 split+glob 运算符exit时,包含数字和包含数字exit $?之间存在差异:$IFS$?

$ 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
Run Code Online (Sandbox Code Playgroud)

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


Ign*_*ams 5

来自help exit

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

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


jll*_*gre 5

你的脚本有几个缺陷:

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

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

  • 第三个exec在正常情况下永远不会返回1,因此该exit调用首先未到达,也是多余的。

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