250以上の賛成投票があるにもかかわらず、私が言うことを気にかけるべき理由
それはことはありません0 = true
と1 = false
。これは、次のとおりです。ゼロ手段なし失敗(成功) とゼロ以外の手段の故障(タイプNの)。
一方で選択した答えは技術的には「真」であるください入れないreturn 1
ために、あなたのコードで** 偽。いくつかの残念な副作用があります。
- 経験豊富な開発者は、あなたをアマチュアとして見つけます(以下の理由により)。
- 経験豊富な開発者はこれを行いません(以下のすべての理由により)。
- エラーが発生しやすいです。
- 経験豊富な開発者でさえ、(上記の理由により)0と1をそれぞれfalseとtrueと間違えることがあります。
- 無関係でばかげたコメントが必要です(または奨励されます)。
- 実際には、暗黙の戻りステータスほど役に立ちません。
バッシュを学ぶ
bashのマニュアルは言う(強調鉱山)
戻る[n]
シェル関数に実行を停止させ、値nを呼び出し元に返します。nが指定されていない場合、戻り値は、関数で最後に実行されたコマンドの終了ステータスです。
したがって、TrueとFalseを示すために0と1を使用する必要はありません。彼らがそうするという事実は、コードのデバッグ、質問へのインタビュー、そして初心者の心を吹き飛ばすためにのみ役立つ本質的に些細な知識です。
bashのマニュアルにも書いてあります
それ以外の場合、関数の戻りステータスは、最後に実行されたコマンドの終了ステータスです。
bashのマニュアルにも書いてあります
($?)最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開します。
ほら、待って。パイプライン?もう一度bashのマニュアルを見てみましょう。
パイプラインは、制御演算子 '|'の1つで区切られた1つ以上のコマンドのシーケンスです。または '|&'。
はい。彼らは、1つのコマンドはパイプラインであると述べました。したがって、これら3つの引用はすべて同じことを言っています。
$?
最後に何が起こったのかを教えてくれます。
- 泡立ちます。
私の答え
したがって、@ Kambusはそのような単純な関数を使用してそれを実証しましたが、まったくreturn
必要ありません。これを読むほとんどの人のニーズに比べると、非現実的に単純だったと思います。
なんでreturn
?
関数が最後のコマンドの終了ステータスを返す場合、なぜ使用return
するのですか?関数の実行を停止させるためです。
複数の条件下で実行を停止する
01 function i_should(){
02 uname="$(uname -a)"
03
04 [[ "$uname" =~ Darwin ]] && return
05
06 if [[ "$uname" =~ Ubuntu ]]; then
07 release="$(lsb_release -a)"
08 [[ "$release" =~ LTS ]]
09 return
10 fi
11
12 false
13 }
14
15 function do_it(){
16 echo "Hello, old friend."
17 }
18
19 if i_should; then
20 do_it
21 fi
ここにあるのは...
LHSがtrueの場合04
に&&
のみRHS が実行されるため、行は明示的な[-ish]を返します。
ライン09
はラインのステータスに一致するtrueまたはfalseを返します08
行13
が原因で行がfalseを返します12
(はい、これでゴルフをすることはできますが、例全体が工夫されています。)
別の一般的なパターン
# Instead of doing this...
some_command
if [[ $? -eq 1 ]]; then
echo "some_command failed"
fi
# Do this...
some_command
status=$?
if ! $(exit $status); then
echo "some_command failed"
fi
status
変数を設定すると、の意味がわかりやすくなり$?
ます。(もちろん$?
、その意味はわかっていますが、いつかGoogleに習熟する必要のある知識が不足しています。コードで高頻度の取引を行わない限り、愛を示し、変数を設定してください。)しかし、本当の要点は「 「存在しないステータス」または逆に「終了ステータスの場合」を読み上げて、その意味を説明できます。ただし、最後の単語exit
は、実際には$(...)
サブシェルを終了しているときに、単語を見るとスクリプトを終了していると思われる可能性があるため、少し野心的すぎる可能性があります。
** return 1
偽りの使用を絶対に主張する場合は、少なくともreturn 255
代わりに使用することをお勧めします。これはあなたの将来の自分、またはあなたのコードを保守しなければならない他の開発者に「なぜ255なのか?」そうすれば、彼らは少なくとも注意を払い、間違いを回避できる可能性が高くなります。
function
キーワードを削除して、myfun() {...}
十分