'return 0'は 'true'と同じですか(シェル環境のソーススクリプトから)?

'return 0'は 'true'と同じですか(シェル環境のソーススクリプトから)?
  • 私はユーザーが自分のシェルにソースを提供する必要がある移植性の高いスクリプトを開発しています。そのため、POSIXスクリプトを使用する必要があります。

  • スクリプトには便利な関数がたくさんあり、そのうちの1つは呼び出し関数の状態を返すという点で特別ですtruefalse


return 0さて、私はこのような状況でそれを使用しました。しかし、より読みやすく、trueforfalsereturn 1それぞれ動作するようです。

問題はこれが有効かどうかです。全く同じようにそれとも違いがある場合です。ありがとうございます。

ベストアンサー1

true移植可能ですが、それ自体では返されません。return true移植性がなく、安定して動作しません。

次の機能がある場合:

f() {
    true
}

そうであれば、はい、終了ステータスが0の関数から返されます。最後から落ちると、最後のコマンドの終了状態を関数の終了状態に戻します。

しかし、もちろん、true中間体自体が制御フローに影響を与えないので、これは実際の状態に戻りません。

g() {
    # silly example condition
    if [ 1 = 1 ]; then
        true
    fi
    echo something else
    false
}

ただし、明示的な戻り値を追加できます。引数がない場合、return最後のコマンドの終了状態も使用されます。:

特殊パラメータ '?'の値はn(符号なし10進整数)に設定し、nが指定されていない場合は最後に実行されたコマンドの終了状態に設定する必要があります。 nが符号なし10進整数でない場合、または255より大きい場合、結果は指定されません。

h() {
    # silly example condition
    if [ 1 = 1 ]; then
        true
        return
    fi
    echo something else
    false
}

これで、return trueいくつかのシェルで好きなように機能することができますが、最終的にはそうではないかもしれません。少なくとも zsh では引数を算術式として扱うように見えるため、return true変数の値が使用され、true設定されていない場合、デフォルトは 0 です。

% i() { return 1+1; }
% i; echo $?
2

% unset true
% j() { return true; }
% j; echo $?
0

% true=123
% j; echo $?
123

andtrueを常にandに設定し、スクリプトライブラリのユーザーがそれを混同しないことを信頼できる場合は、zshまたは標準シェルでandを使用できます。これらの名前を使用することはお勧めできませんが、同じ名前を使用することもできます。0false1return truereturn falsereturn "$true"return "$false"true_return_valuefalse_return_value

それ以外の場合は、標準シェルでtrue; returnandを使用できますが、これがandより読みやすいfalse; returnかどうかはわかりません。いずれにせよ、シェルプログラマは実際の戻り値がゼロであることに精通している必要があります。return 0return 1

おすすめ記事