这两个命令有什么区别:
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
是空参数、损坏的重定向或execfail
bash 选项集(不是默认设置)。第一个和第二个在这里不适用,并且没有证据表明第三个在这里适用。
答案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
在第一种情况下,由于$?
未加引号,因此会受到分词的影响。使用$IFS
contains时, ( )1
的内容被拆分为 中的一个空参数,因此就好像您调用了.$?
1
bash
exit ''