Bash:コマンドを設定されていない/エクスポートされた複数のコマンドに置き換える

Bash:コマンドを設定されていない/エクスポートされた複数のコマンドに置き換える

一部の変数の設定を解除し、コマンド置換を使用して他の変数をエクスポートしようとしています。これは働きます:

$(echo "
    export TEST_A=1
    export TEST_B=2
")

これ:

$(echo "
    unset TEST_A
    unset TEST_B
")

ただし、これはDebian JessieのOSXリリースとBash 4.3.30(1)リリースの両方で失敗します。

$(echo "
    unset TEST_A
    export TEST_B=1
")
# bash: unset: `TEST_B=1': not a valid identifier

これが予想される動作ですか?コマンド置換を使用して複数の変数を設定解除してエクスポートするには?

いくつかのコンテキストを提供するには:boot2dockerの問題

答え1

存在する:

$(echo "
  export TEST_A=1
  export TEST_B=2
")

$(...)1つの拡張のみが単純なコマンドで解析されます。

したがって、$(...)拡張は分割+グローブ演算子を通過します。出力にはecho末尾の改行が切り捨てられ、IFS文字(デフォルトでは改行、スペース、タブ)の単語に分割されます。

  • export
  • TEST_A=1
  • export
  • TEST_B=2

各単語はワイルドカード文字を介して渡されます。ここにはワイルドカード文字が含まれていないため、それ自体が拡張されます。したがって、ワイルドカードを使用した後でも、同じ4つの文字列のリストがまだあります。

実行するコマンドは、最初のコマンドから派生します。ここで、exportこれらの文字列はすべてコマンドにパラメータとして渡されます。したがって、ここには次のように書きました。

export TEST_A=1 export TEST_B=2

したがって、TEST_A値が1の変数、export値が変更されない変数、TEST_B値が2の変数をエクスポートします。

実行中の最後の項目で、次の操作を行います。

unset TEST_A export TEST_B=1

echo出力をシェルコードとして解釈するには、次のものを使用する必要があります。eval そして使用しないでください分割+グローバル演算子(コマンド代替引用):

eval "$(echo "
  unset TEST_A
  export TEST_B=1
")"

それも簡単なコマンド。 2つの文字列:eval<newline><spaces>unset TEST_A<newline><spaces>export TEST_B=1

evalシェルコードの引数の内容を評価します。unset TEST_Aしたがって、export TEST_B=1次の2つのシェルコマンドラインを実行します。簡単なコマンド)。

関連情報