Warum muss ich zweimal mit einem Punkt abschließen?

13

Ich weiß, dass wir einem besonderen Charakter wie *(){}$mit entkommen können \, um als Literaten zu gelten.
Zum Beispiel \*oder\$

Aber im Falle, .dass ich es zweimal machen muss, gilt \\.es als Sonderzeichen. Beispiel:

man gcc | grep \\.

Wieso ist es so?

registrierter Nutzer
quelle
Können Sie den Fall geben, dass Sie zweimal fliehen müssen?
16.
man bash|grep \\.könnte ein Beispiel sein.
Registrierter Benutzer
3
Genauer gesagt, du entkommst dot nicht zweimal, du entkommst dem Escape-Zeichen, so dass es
Cthulhu
5
Sie könnten Anführungszeichen verwenden , um Backslash Zeichen zu vermeiden entkommen: man gcc | grep '\.'.
Leonid Beschastny
1
Ich bevorzuge den Vorschlag von @ LeonidBeschastny, da deutlich wird, was los ist
Izkata

Antworten:

24

Im Allgemeinen müssen Sie nur einmal entkommen, um ein Sonderzeichen als wörtlich zu betrachten. Manchmal müssen Sie es zweimal tun, weil Ihr Muster von mehr als einem Programm verwendet wird.

Lassen Sie uns Ihr Beispiel diskutieren:

man gcc | grep \\.

Dieser Befehl wird von zwei Programmen bashinterpretiert , Interpreter und grep. Die erste Flucht verursacht bashweiß \ist wörtlich, so dass der zweite für ist passieren grep.

Wenn Sie nur einmal entkommen \., bashwissen Sie , dass dieser Punkt wörtlich ist, und gehen Sie .zu grep. Wenn grepman das sieht ., denkt man, der Punkt ist ein Sonderzeichen, kein wörtliches Zeichen.

Wenn Sie zweimal entkommen, bash wird vergehen Muster \.zu grep. Jetzt grepwissen Sie, dass es ein buchstäblicher Punkt ist.

cuonglm
quelle
: Hängt das Escape-Zeichen für Punkt von der Anzahl der verwendeten Pipes ab? .Zum Beispiel cmd | cmd | cmd | cmd \\\\. Ist das korrekt????
Thushi
6
@Thushi: Nein. Dies hat nichts mit der Tatsache zu tun, dass Sie eine (oder mehrere) Pipe-Zeichen verwenden, sondern gilt auch für grep \\. my_file. Die Kommandozeile wird von der Shell interpretiert, wobei die erste verwendet wird \ , um der zweiten zu entgehen, so dass eine \ buchstäblich an grep übergeben wird. Der Punkt .ist nicht speziell für die Shell, daher wird er trotzdem wörtlich übergeben. Grep liest dann die (einzelne) \ und verwendet sie, um den Punkt zu maskieren ..
Ansgar Esztermann
@AnsgarEsztermann: Ja. Das ist wahr. Überprüft es. Danke :)
Thushi
2
Ich glaube, die Antwort ist insofern etwas falsch, als sie lautet: "Die erste Flucht bewirkt, dass Bash weiß. Ist wörtlich, die zweite ist für Grep." Tatsächlich lässt die erste Flucht bash wissen, dass \ leteral ist und passiert \. zu greifen.
Cthulhu
@ Gnouc Ich glaube nicht, dass es hat. echo .in der Bash nur ... Echos Bach .Charakter.
Cthulhu