grep -Fを使用してもドル記号をエスケープする必要があるのはなぜですか?

grep -Fを使用してもドル記号をエスケープする必要があるのはなぜですか?
# minimal example file
printf "hey\$you\nhey\$me\n" > test
cat test
# hey$you
# hey$me

簡単にgrep言うと:

grep -F "hey$you" test
# hey$you
# hey$me

つまり、最初の行だけが一致する必要がある場合、両方の行が一致します。

脱出すると$予想通りに動作します。

grep -F "hey\$you" test
# hey$you

しかし、これは私の理解に反する-F/--fixed-strings

パターンを固定文字列のセットとして解釈します(つまり、grepアクションを強制的にfgrep)。

man fgrep特に何もありません$

macOSとUbuntuからコピー

答え1

これシェル$you「弱い」(二重)参照を使用したため、(おそらく空の)変数に展開されます。

xシェルのオプションを設定してこれを確認できます。

$ grep -F "hey$you" test
+ grep --color=auto -F hey test
# hey$you
# hey$me

ご覧のとおり"hey$you"簡単になりますhey。 2行を一致させます。

代わりに、パターンの周りに二重引用符(単一引用符)を使用してください。

$ grep -F 'hey$you' test
+ grep --color=auto -F 'hey$you' test
# hey$you

関連情報