一部の変数の設定を解除し、コマンド置換を使用して他の変数をエクスポートしようとしています。これは働きます:
$(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つのシェルコマンドラインを実行します。簡単なコマンド)。