*(){}$
のような特殊文字を_\
_でエスケープしてリテラルと見なすことができることを知っています。
例:_\*
_または_\$
_
しかし、_.
_の場合、_\\.
_のように2回実行する必要があります。それ以外の場合は、特殊文字と見なされます。例:
_man gcc | grep \\.
_
なぜそうなのですか?
一般に、特殊文字をリテラルと見なすには、1回エスケープするだけです。パターンは複数のプログラムで使用されるため、場合によっては2回実行する必要があります。
あなたの例について議論してみましょう:
man gcc | grep \\.
このコマンドは、bash
インタープリターとgrep
の2つのプログラムによって解釈されます。最初のエスケープはbash
が\
がリテラルであることを認識させるため、2番目はgrep
へのパスです。
一度だけエスケープすると、\.
、bash
はこのドットがリテラルであることを認識し、.
をgrep
に渡します。 grep
がこの.
を参照すると、ドットはリテラルではなく特殊文字であると見なされます.
2回エスケープすると、bash
はパターン\.
をgrep
に渡します。これでgrep
がリテラルドットであることを認識しました。