Dlaczego muszę dwa razy uciec przed „kropką”?


13

Wiem, że możemy uciec od znaku specjalnego, takiego jak *(){}$z \, aby zostać uznani za literały.
Na przykład \*lub\$

Ale w przypadku, .gdy muszę to zrobić dwa razy, \\.inaczej jest to uważane za charakter specjalny. Przykład:

man gcc | grep \\.

Dlaczego tak jest


Czy możesz podać sprawę, że musisz dwa razy uciec?
cuonglm

man bash|grep \\.może być przykładem.
Zarejestrowany użytkownik

3
Mówiąc dokładniej, nie uciekasz dwa razy kropką, uciekasz przed ucieczką, aby została przekazana grepowi
Cthulhu

5
Można użyć cudzysłowu, aby uniknąć ucieczki kreski ułamkowe odwrócone: man gcc | grep '\.'.
Leonid Beschastny

1
Zdecydowanie wolę sugestię @ LeonidBeschastny ze względu na to, jak wyraźniejsze jest to, co się dzieje
Izkata

Odpowiedzi:


24

Ogólnie rzecz biorąc, musisz uciec tylko raz, aby uczynić postać specjalną uważaną za dosłowną. Czasami musisz to zrobić dwa razy, ponieważ Twój wzór jest używany przez więcej niż jeden program.

Niech dyskutuje twój przykład:

man gcc | grep \\.

To polecenie jest interpretowane przez dwa programy, bashtłumacza i grep. Pierwsza przyczyna ucieczki bashwie, że \jest dosłowna, więc druga jest przepustką grep.

Jeśli można uciec tylko jeden raz, \., bashbędzie wiedział, to kropka jest dosłowne, i przekazać .do grep. Kiedy grepto widzi ., myśli, że kropka jest znakiem specjalnym, a nie dosłownym.

Jeśli uciekniesz dwa razy, bashprzekaże wzór \.do grep. Teraz grepwiedz, że to dosłowna kropka.


: Czy zatem znak zmiany znaczenia dla kropki zależy od liczby używanych rur? Na przykład cmd | cmd | cmd | cmd \\\\. Czy to jest poprawne????
Thushi,

6
@Thushi: Nie. Nie ma to nic wspólnego z faktem, że używasz (lub kilku) znaków potoku, ale dotyczy nawet grep \\. my_file. Linia poleceń jest interpretowana przez powłokę, używając pierwszego, \ aby uciec przed drugim, więc jeden \ jest przekazywany dosłownie do grep. Kropka .nie jest wyjątkowa dla powłoki, więc i tak jest przekazywana dosłownie. Grep następnie czyta (pojedynczy) \ i używa go do ucieczki z kropki ..
Ansgar Esztermann

@AnsgarEsztermann: Tak. To prawda. Sprawdziłem to. Dzięki :)
Thushi,

2
Uważam, że odpowiedź jest nieco niepoprawna, ponieważ mówi: „Pierwsza ucieczka powoduje, że bash wie. Jest dosłowny, a drugi dla grep.”. Właściwie, pierwsza ucieczka pozwala bashowi wiedzieć, że \ jest leteral, a pass \. grep
Cthulhu

@Gnouc Nie sądzę, że ma. echo .w bash po prostu ... echo .charakteru Bacha .
Cthulhu,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.