Perché devo sfuggire a un "punto" due volte?


13

So che siamo in grado di sfuggire a un carattere speciale come *(){}$con \in modo da essere letterali considerati.
Ad esempio \*o\$

Ma in caso di .devo farlo due volte, come \\.altrimenti è considerato un personaggio speciale. Esempio:

man gcc | grep \\.

Perché è così?


Puoi dare il caso di dover scappare due volte?
cuonglm,

man bash|grep \\.potrebbe essere un esempio.
Utente registrato

3
Più precisamente, non sfuggire al punto due volte, sfuggire al personaggio di fuga in modo che venga passato a grep
Cthulhu,

5
Si potrebbe utilizzare le virgolette per evitare la fuga barre rovesciate: man gcc | grep '\.'.
Leonid Beschastny,

1
Preferisco fortemente il suggerimento di @ LeonidBeschastny a causa di quanto è più chiaro ciò che sta succedendo
Izkata

Risposte:


24

Generalmente, devi fuggire solo una volta per rendere il personaggio speciale considerato letterale. A volte devi farlo due volte, perché il tuo schema è usato da più di un programma.

Lascia che discuti il ​​tuo esempio:

man gcc | grep \\.

Questo comando è interpretato da due programmi, bashinterprete e grep. La prima causa di fuga bashsa che \è letterale, quindi la seconda è pass per grep.

Se si sfuggire una sola volta, \., bashsaprà questo punto è letterale, e passare .a grep. Quando grepvedi questo ., pensa che il punto sia un carattere speciale, non letterale.

Se scappi due volte, bashpasserà il motivo \.a grep. Ora grepsappi che è un punto letterale.


: Quindi, il carattere di escape per punto dipende dal numero di pipe che usiamo? Ad esempio cmd | cmd | cmd | cmd \\\\. È corretto????
Thushi,

6
@Thushi: No. Questo non ha nulla a che fare con il fatto che stai usando uno (o più) caratteri pipe, ma vale anche per grep \\. my_file. La riga di comando viene interpretata dalla shell, usando la prima \ per sfuggire alla seconda, quindi \ si passa letteralmente a grep. Il punto .non è speciale per la shell, quindi viene passato alla lettera comunque. Grep quindi legge il (singolo) \ e lo usa per sfuggire al punto ..
Ansgar Esztermann,

@AnsgarEsztermann: Sì. È vero. Controllato. Grazie :)
Thushi,

2
Credo che la risposta sia in qualche modo errata in quanto dice "La prima fuga fa sì che Bash lo sappia. È letterale, la seconda è per Grep". In realtà, la prima fuga fa sapere a bash che \ è leterale e passa \. grep.
Cthulhu,

@Gnouc Non penso che abbia. echo .nella bash solo ... fa eco al .personaggio di Bach .
Cthulhu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.