出力が `3`の代わりに `$var`の下に表示されるのはなぜですか? [閉鎖]

出力が `3`の代わりに `$var`の下に表示されるのはなぜですか? [閉鎖]

次の例が出たのはなぜですか?矢の答え$var代わりに出力3

or$varに一重引用符またはバックスラッシュを使用します。'$var'\$var

  • まず、$var実行可能プログラムの実行環境に文字通り渡されます/bin/echo
  • その後、実行可能プログラムの実行環境でパラメータ拡張が発生すると、/bin/echo環境変数が適用されます。var=3$var

実行可能プログラムの実行環境内でパラメータ拡張が行われないのはなぜですか/bin/echoメモ:

  • ソースシェルは$var一重引用符またはバックスラッシュなので、ソースシェルの実行環境で拡張しないでください。

  • 元のシェルは周囲の一重引用符やバックスラッシュを削除して$varから$var環境変数をvar=3実行の実行環境に渡すので、パラメータの/bin/echo拡張は$var 実行の実行環境で行わなければならないと思います/bin/echo

ちなみに私は以前はset -x追跡情報を出力したが、拡張後の実行前の実際の結果が何であるかはわかりません。

ありがとうございます。

tim$ unset var
$ set -x

tim$ var=3 /bin/echo '$var'
+ var=3
+ /bin/echo '$var'
$var

tim$ var=3 /bin/echo \$var
+ var=3
+ /bin/echo '$var'
$var

$ var=3 exec /bin/echo \$var | cat
+ cat
+ var=3
+ exec /bin/echo '$var'
$var

tim$ var=3 exec /bin/echo '$var' | cat
+ var=3
+ exec /bin/echo '$var'
+ cat
$var

答え1

それぞれの場合に、変数の拡張を防ぐ強力な参照を使用するか、変数の拡張を防ぐ強力な参照を使用します。または、エスケープ$文字を使用すると、もはや拡張する必要がある変数ではありません。 /bin/echoまた、catパラメータや変数の拡張は行われていないため、パイピングによってこれは発生しません。

関連情報