web-dev-qa-db-ja.com

「exit;」と「exit $ ?;」の違い

これらの2つのコマンドに違いはありますか?

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

そして

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

それは $?最初のケースでは冗長ですか?

2
Alexander Mills

スクリプトにはいくつかの欠陥があります。

exec "$(dirname "$0")/suman-Shell";
exit $?;
  • 1つ目は、末尾のセミコロンが冗長であるということです。それらは無害ですが、目的を果たしません。行末はすでに区切り文字であり、セミコロンは1行の複数のコマンド間の区切り文字として使用されます。ここにそれらが存在すると、コードの可読性がわずかに悪化します。

  • 2番目はexitで、デフォルトでは前のコマンドの終了ステータスを返すため、$?は、意図を示していますが、冗長です。

  • 3つ目はexecは通常の状況では決して戻りません1、したがって、exit呼び出しは最初から到達せず、冗長でもあります。

1execが返されるのは、空の引数、壊れたリダイレクト、またはexecfailbashオプションセット(デフォルト設定ではありません)のみです。 1番目と2番目のものはここでは適用されず、3番目のものが適用されるという証拠はありません。

4
jlliagre

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の分割の対象になります。 $IFS1が含まれている場合、$?1)の内容はbashの1つの空の引数に分割されるため、exit ''を呼び出したかのようになります。

2