これらの2つのコマンドに違いはありますか?
exec "$(dirname "$0")/suman-Shell";
exit $?;
そして
exec "$(dirname "$0")/suman-Shell";
exit;
それは $?
最初のケースでは冗長ですか?
スクリプトにはいくつかの欠陥があります。
exec "$(dirname "$0")/suman-Shell";
exit $?;
1つ目は、末尾のセミコロンが冗長であるということです。それらは無害ですが、目的を果たしません。行末はすでに区切り文字であり、セミコロンは1行の複数のコマンド間の区切り文字として使用されます。ここにそれらが存在すると、コードの可読性がわずかに悪化します。
2番目はexit
で、デフォルトでは前のコマンドの終了ステータスを返すため、$?
は、意図を示していますが、冗長です。
3つ目はexec
は通常の状況では決して戻りません1、したがって、exit
呼び出しは最初から到達せず、冗長でもあります。
1exec
が返されるのは、空の引数、壊れたリダイレクト、またはexecfail
bashオプションセット(デフォルト設定ではありません)のみです。 1番目と2番目のものはここでは適用されず、3番目のものが適用されるという証拠はありません。
help exit
から:
ステータスNでシェルを終了します。Nを省略すると、終了ステータスは最後に実行されたコマンドのステータスになります。
そうです、それは完全に冗長です。
厳密に言えば、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
最初のケースでは、$?
が引用符で囲まれていないため、Wordの分割の対象になります。 $IFS
に1
が含まれている場合、$?
(1
)の内容はbash
の1つの空の引数に分割されるため、exit ''
を呼び出したかのようになります。