サブシェルでコマンドを実行せずにコマンド出力を変数に割り当てるにはどうすればよいですか?

サブシェルでコマンドを実行せずにコマンド出力を変数に割り当てるにはどうすればよいですか?

次の機能がある場合:

TEST()
{
    if [[ "$1" == "hi" ]]
    then
        exit 1
    fi

    echo "Some text"
}

現在のシェルでこの関数を実行すると:

TEST "hi"

すべてが期待どおりに動作します。関数のif文がtrueになり、スクリプト全体が終了します。一方、私がそうするなら:

FUNCTION_OUTPUT=$(TEST "hi")

このようにして、変数の関数からstdoutをキャプチャできます。関数内のifステートメントはまだtrueで、「exit 1」は引き続き実行されますが、サブシェルで実行されているため、スクリプトは引き続き実行されます。

VAR_NAME = $()を使用してサブシェルで何かを実行して変数に割り当てるのではなく、私の関数の "exit 1"行が実際にスクリプト全体を終了するように現在のシェルでこれを実行する方法はありますか?

ベストアンサー1

変数の割り当てはただ簡単なコマンドだから、あなたは使用することができますif条件関数が成功したか失敗したかを確認してください。

if ! FUNCTION_OUTPUT=$(TEST hi); then
  echo Function return non-zero status
  exit 1
fi

# This line never printed
printf '%s\n' "$FUNCTION_OUTPUT"

関数が成功すると、FUNCTION_OUTPUT関数の結果を含む変数が得られます。

if ! FUNCTION_OUTPUT=$(TEST hii); then
  echo Function return non-zero status
  exit 1
fi

# Output content of FUNCTION_OUTPUT
printf '%s\n' "$FUNCTION_OUTPUT"

おすすめ記事