"도트"를 두 번 탈출해야하는 이유는 무엇입니까?


13

나는 우리가 같은 특수 문자를 벗어날 수 있다는 사실을 알고 *(){}$함께 \고려 리터럴되도록.
예를 들어 \*또는\$

그러나 .내가 두 번 해야하는 경우 \\.특별한 성격으로 간주됩니다. 예:

man gcc | grep \\.

왜 그래야만하지?


당신은 두 번 탈출 해야하는 경우를 줄 수 있습니까?
cuonglm

man bash|grep \\.예가 될 수 있습니다.
등록 된 사용자

3
보다 정확하게, 당신은 점을 두 번 탈출하지 않습니다, 당신은 grep에 전달되도록 탈출 문자를 탈출
Cthulhu

5
백 슬래시 문자 이스케이프를 피하기 위해 따옴표를 사용할 수 있습니다 man gcc | grep '\.'.
Leonid Beschastny

1
나는 그것이 진행되고있는 것이 훨씬 더 명확하기 때문에 @LeonidBeschastny의 제안을 강력하게 선호합니다
Izkata

답변:


24

일반적으로 특수 문자를 리터럴로 만들려면 한 번만 탈출하면됩니다. 패턴이 둘 이상의 프로그램에서 사용되기 때문에 때때로 두 번 수행해야합니다.

예를 들어 보자.

man gcc | grep \\.

이 명령은 두 개의 프로그램 인 bash해석기 및로 해석 grep됩니다. 첫 번째 탈출의 원인 bash을 알고 \두 번째가 통과하므로, 문자입니다 grep.

당신이 한 번만 탈출하는 경우 \., bash이 점은 문자 그대로 알고, 그리고 전달합니다 .grep. 때 grep이것을 볼 .,이 점은 특수 문자, 리터럴없는 생각.

두 번 탈출하면 bash패턴 \.을로 전달 합니다 grep. 이제 grep그것이 문자 점이라는 것을 알고 있습니다.


: 점의 이스케이프 문자는 사용하는 파이프 수에 따라 달라 집니까? 예를 들어 cmd | cmd | cmd | cmd \\\\. 그 맞습니까????
Thushi

6
@Thushi : 아니요. 이것은 (또는 여러 개의) 파이프 문자를 사용한다는 사실과 관련이 없지만에도 적용됩니다 grep \\. my_file. 명령 행은 쉘에 의해 해석되며, 첫 번째 명령은 \ 두 번째 명령 을 이스케이프하므로 \ 문자 그대로 grep으로 전달됩니다. 점 .은 쉘에 특별하지 않으므로 어쨌든 그대로 전달됩니다. Grep은 (단일)을 읽고 \ 그것을 사용하여 dot을 이스케이프합니다 ..
Ansgar Esztermann

@AnsgarEsztermann : 예. 사실입니다. 확인했습니다. 감사합니다 :)
Thushi

2
나는 "bash가 첫 번째 이스케이프를 일으키는 원인은 문자 그대로, 두 번째는 grep을위한 것"이라는 대답이 다소 틀렸다고 생각합니다. 실제로 첫 번째 이스케이프는 bash에게 \가 치명적임을 알리고 \를 전달합니다. grep.
크 툴후

@Gnouc 나는 그것이 있다고 생각하지 않습니다. echo .bash에서 그냥 ... 바흐 .문자를 에코 합니다.
크 툴후
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.