回答:
ここには2つのシェルがあります。
呼び出しシェル、これを実行している対話型シェル
によって生成された非ログイン、非インタラクティブシェル bash -c
ここで問題は、二重引用符内で変数がそれぞれの値に展開されることです。これはどのシェルにも当てはまります。
したがって、二重引用符を使用したように、変数の展開$v
は実際には、呼び出されたシェルではなく、呼び出し元のシェルで行われています。しかし、宣言v=value
は呼び出された非対話型シェルで行われています。
したがって、全体として、呼び出されたシェルで定義され、呼び出し元のシェルで(事前に)展開された変数があります。値変数が呼び出し側シェルで設定されていないため、出力には何も表示されません。
ここで、変数の定義と展開をスポーンされたシェルで実行するには、単一引用符を使用するか、エスケープし$
ます。
$ bash -c "v=value; echo $v"
$ bash -c 'v=value; echo $v'
value
$ bash -c "v=value; echo \$v"
value
二重引用符$v
を使用すると、インタラクティブシェルに置き換えられます。一重引用符を使用します。
$ bash -c 'v=value;echo $v'
value