web-dev-qa-db-ja.com

「ドット」を2回エスケープする必要があるのはなぜですか?

*(){}$のような特殊文字を_\_でエスケープしてリテラルと見なすことができることを知っています。
例:_\*_または_\$_

しかし、_._の場合、_\\._のように2回実行する必要があります。それ以外の場合は、特殊文字と見なされます。例:

_man gcc | grep \\.
_

なぜそうなのですか?

14
Registered User

一般に、特殊文字をリテラルと見なすには、1回エスケープするだけです。パターンは複数のプログラムで使用されるため、場合によっては2回実行する必要があります。

あなたの例について議論してみましょう:

man gcc | grep \\.

このコマンドは、bashインタープリターとgrepの2つのプログラムによって解釈されます。最初のエスケープはbash\がリテラルであることを認識させるため、2番目はgrepへのパスです。

一度だけエスケープすると、\.bashはこのドットがリテラルであることを認識し、.grepに渡します。 grepがこの.を参照すると、ドットはリテラルではなく特殊文字であると見なされます.

2回エスケープすると、bashはパターン\.grepに渡します。これでgrepがリテラルドットであることを認識しました。

25
cuonglm