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)
$?在第一种情况下是多余的吗?
严格来说,当您忘记引用数字并因此调用 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 ''
你的脚本有几个缺陷:
exec "$(dirname "$0")/suman-shell";
exit $?;
Run Code Online (Sandbox Code Playgroud)
第一个是结尾的分号是多余的。它们是无害的,但没有任何作用。行尾已经是一个分隔符,分号用作一行上多个命令之间的分隔符。它们的存在稍微降低了代码的可读性。
第二个是exit默认返回前一个命令的退出状态,因此说明$?是多余的,尽管表明了意图。
第三个exec在正常情况下永远不会返回1,因此该exit调用首先未到达,也是多余的。
1exec返回的唯一情况是空参数、损坏的重定向或execfailbash 选项集(这不是默认设置)。第一个和第二个在这里不适用,第三个也没有证据。