次の例が出たのはなぜですか?矢の答え$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
パラメータや変数の拡張は行われていないため、パイピングによってこれは発生しません。