コマンドの bash スクリプト一時値

コマンドの bash スクリプト一時値

次のコマンドと同様に、

if true; then
   IFS=":" read a b c d e f <<< "$test"

本は、割り当てコマンド(IFS ":")がメインコマンド()の前に使用される場合、read a b c d e f <<< "$value"その値が一時的にメインコマンドに有効であることを示しています。したがって、readコマンドは区切り文字を使用します:

しかし、このコマンドのように

if true; then
   HOME="hello" echo "$HOME"

エコメッセージはhelloではありません。上記のコマンドは実際に何を意味しますか?

ベストアンサー1

評価がどのように行われるかという問題で帰結します。どちらの例も同じ方法で動作しますが、シェル(ここではbash)が変数を拡張する方法が原因で問題が発生します。

このコマンドを書くとき:

HOME="foo" echo $HOME

$HOME拡張コマンドが実行される前。したがって、コマンドに設定した新しい値ではなく元の値に展開されます。変数はHOMEコマンドが実行される環境で変更されますが、親変数から変数を印刷します。echo$HOME

これを説明するために、次の状況を考慮してください。

$ HOME="foo" bash -c 'echo $HOME'
foo
$ echo $HOME
/home/terdon

上記のように、最初のコマンドは一時的に変更された値を印刷し、2番目のコマンドは元の値を印刷し、変数が一時的にのみ変更さHOMEれたことを示します。コマンドは二重引用符()ではなく一重引用符()で囲まれているため、bash -c ...変数は拡張されずに変更されずに新しいbashプロセスに渡されます。その後、この新しいプロセスはそれを展開し、設定された新しい値を印刷します。次のコマンドを使用すると、これが起こっていることがわかります。' '" "set -x

$ set -x
$ HOME="hello" echo "$HOME"
+ HOME=hello
+ echo /home/terdon
/home/terdon

上からわかるように、変える $HOMEに渡されませんecho。拡張子の値のみを表示できます。比較:

$ HOME="hello" bash -c 'echo $HOME'
+ HOME=hello
+ bash -c 'echo $HOME'
hello

ここでは、一重引用符のため、変数はその値の代わりに新しいプロセスに渡されます。

おすすめ記事