GNU/Linux >> Linux の 問題 >  >> Linux

Bashのコマンド置換への変数代入の終了コード

local と組み合わせた場合はこの限りではないことに注意してください。 、 local variable="$(command)" のように . command であっても、そのフォームは正常に終了します 失敗しました。

たとえば、次の Bash スクリプトを見てください:

#!/bin/bash

function funWithLocalAndAssignmentTogether() {
    local output="$(echo "Doing some stuff.";exit 1)"
    local exitCode=$?
    echo "output: $output"
    echo "exitCode: $exitCode"
}

function funWithLocalAndAssignmentSeparate() {
    local output
    output="$(echo "Doing some stuff.";exit 1)"
    local exitCode=$?
    echo "output: $output"
    echo "exitCode: $exitCode"
}

funWithLocalAndAssignmentTogether
funWithLocalAndAssignmentSeparate

これの出力は次のとおりです:

[email protected]:~$ ./tmp.sh 
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1

これは local のためです 実際には組み込みコマンドであり、 local variable="$(command)" のようなコマンドです local を呼び出します command の出力を置き換える .したがって、 local から終了ステータスを取得します .


$(command) としてコマンドを実行すると コマンドの出力がそれ自体を置き換えることができます。

あなたが言うとき:

a=$(false)             # false fails; the output of false is stored in the variable a

コマンド false によって生成される出力 変数 a に格納されます .さらに、終了コードは、コマンドによって生成されるものと同じです。 help false 教えてください:

false: false
    Return an unsuccessful result.

    Exit Status:
    Always fails.

一方、次のように言います:

$ false                # Exit code: 1
$ a=""                 # Exit code: 0
$ echo $?              # Prints 0

割り当ての終了コードを a にします 0 が返されます .

編集:

マニュアルからの引用:

<ブロック引用>

展開の 1 つにコマンド置換が含まれている場合、コマンドの終了ステータスは、最後に実行されたコマンド置換の終了ステータスです。

BASHFAQ/002 からの引用:

<ブロック引用>

コマンドの戻り値や出力を変数に保存するにはどうすればよいですか?

...

output=$(command)

status=$?

output への代入 command には影響しません の終了ステータス、まだ $? のままです .


Linux
  1. Bashスクリプト(I)

  2. バッシュ演算子の違い[[Vs[Vs(Vs((?

  3. Bash変数代入の単一括弧?

  1. Linux bash:複数の変数の割り当て

  2. 最後の終了コードを含む Bash プロンプト

  3. -e は bash シバンで何をしますか?

  1. Bashコマンドラインの終了コードがわかりやすく説明されています

  2. Bashで$(コマンド置換)内で引用しますか?

  3. Bashで合法的なコマンドの前に変数を設定するのはなぜですか?