パラメータインフレを防ぐ方法は?

パラメータインフレを防ぐ方法は?

パラメータインフレを防ぐ方法は?するバッシュマニュアルこれはどこかに言及されていますか?そこに記載されている場所を見つけるのを手伝ってくれてありがとう。

例えば、

$ b=1
$ echo $b
1

bashインタプリタがそれを解釈すると、実行される前にecho $bパラメータ拡張が行われます。したがって、子プロセスに渡すためにシェルプロセスの環境変数を作成する必要はありません。$becho $bbecho $b

比較のために他の例を考えるhttps://unix.stackexchange.com/a/261406/674

$ b=1
$ c=$(b=2; echo $b)
$ echo $c
2

元のシェルでは、bashインタプリタが解釈されると値に拡張されませc=$(b=2; echo $b)ん。$b1

コマンド置換サブシェルでは、bashインタプリタがそれを解釈すると値に拡張されb=2; echo $bます。$b2

元のシェルからパラメータ拡張を防止します$bが、$bサブシェルへのパラメータ拡張を維持することは何ですか?

引用符はパラメータの拡張を防ぎます。たとえば、"$b"パラメータの拡張は引用符なしで行われます。コマンド置換はその中でパラメータ拡張を防ぎますか?

答え1

誤解しました。二重引用符は"$b"パラメータ拡張を妨げません。パス名拡張(別名ワイルドカード)そしてフィールド断片化

パラメーターの拡張を防ぐには、次のものを使用する必要があります。引用する、良いアポストロフィ '$b'または逃げる \$b:

$ echo '$b'

または:

$ echo \$b

その後、$b文字通り出力します。


この例では、パラメータ拡張を妨げることはありません。

シェルが input を読み取るとc=$(b=2; echo $b)実行されます。トークン認識$(、これがコマンドで置き換えられたトークンであることを確認してください。したがって$(、および間の残りの文字列は、)現在のシェルではなくコマンド置換によって生成されたサブシェルで解釈されるものとして扱われます。

関連情報