2016-09-02 3 views
2

Zsh은 echo 백 슬래시를 시도 할 때 이상한 백 슬래시를 수행하는 것 같습니다. 나는 이것에 대한 아주 명확한 패턴을 이해하는 것처럼 보이지 않는다. 이 광기에 대한 이유가 있습니까? 물론, 실제로 백 슬래시를 제대로 사용하고 싶다면 적절한 인용 부호 등을 사용 하겠지만, 왜 이것이 처음부터 발생합니까?Zsh 백 슬래시 광기?

여기에 같은 보여주기 위해 작은 예입니다 :

$ echo \\ 
\ 
$ echo \\ \\ 
\ \ 
$ echo \\ \\ \\ 
\ \ \ 
$ echo \\ \\ \\ \\ 
\ \ \ \ 
$ echo \\\\ \\ \\ 
\ \ \ 
$ echo \\\\\\ \\ 
\\ \ 
$ echo \\\\\\\\ 
\\ 

내가 처음에 독립적으로 얼마 전에이를 발견하지만, 자크 Riggle에 의해 this tweet하여 생각 나게했다.

답변

5

첫 번째 단계에서 echo 명령은 특별하지 않습니다. 명령 행은 실행중인 명령과는 별개의 규칙으로 구문 분석됩니다. 이 단계의 전체적인 효과는 명령을 일련의 문자에서 일련의 단어로 변환하는 것입니다.

이 예제를 이해하기 위해 알아야 할 두 가지 일반 구문 분석 규칙은 다음과 같습니다. 공백 문자는 단어를 분리하고 백 슬래시 문자는 자체를 포함하여 특수 문자를 이스케이프합니다.

그래서 명령 echo \\ 2 개 단어리스트된다 :

echo 
\ 

제 슬래시 두번째 단어 인 backslash 그 결과, 두 번째 탈출.

echo \\ \\ \\ \\ 

단어의 목록이된다 :

echo 
\ 
\ 
\ 
\ 

이제 명령 줄 구문 분석이 이루어집니다. 이제는 쉘이 첫 번째 단어로 명명 된 명령을 찾습니다. 지금까지 명령이 echo이라는 사실은 무의미했습니다. cat \\ \\ \\ \\라고 말하면 cat은 4 개의 인수 단어로 호출되며 각각은 단일 백 슬래시를 포함합니다.

일반적으로 echo을 실행하면 쉘 내장 명령이 표시됩니다. zsh 내장 에코는 구성 가능한 동작을가집니다. setopt BSD_ECHO을 사용하여 BSD 스타일 에코 동작을 선택하고 싶지만 샘플 출력에서 ​​기본 모드 인 SysV 스타일로 나타납니다.

BSD 스타일 반향은 백 슬래시 처리를 수행하지 않고 수신 한 그대로 인쇄합니다.

시스템 V 에코 프로세스 백 슬래시 C 문자열처럼 탈출 - \t는 탭 문자되고, \r 또한 \c는 "개행없이 출력을 종료」로 해석 등 캐리지 리턴을하게된다.

그래서 당신은 echo a\\tb 다음 쉘 구문 분석 에코 주어진 인수 단어 하나의 백 슬래시 결과 및 a\tb 및 인쇄 a 및 탭으로 구분 b를 해석 할 에코 것이라고 말했다 경우. echo 'a\tb'이라고 쓰면 더 읽기 쉬울 것입니다. 아포스트로피를 사용하여 쉘 명령 구문 분석 레벨에서 인용 부호를 제공하십시오. 마찬가지로 echo \\\\은 명령 행 구문 분석 후 두 개의 백 슬래시이므로 echo는 \\을보고 백 슬래시 하나를 출력합니다. 다른 형식의 인용 부호를 사용하지 않고 문자 그대로 a\tb을 인쇄하려면 echo a\\\\tb라고해야합니다.명령 행에서 두 개의 백 슬래시 인수 단어 하나의 백 슬래시를 만들기 위해 -

그래서 쉘은 간단한 규칙이있다. 그리고 에코는 간단한 규칙을 가지고 있습니다 - 출력에서 ​​하나의 백 슬래시를 만드는 인수 단어에서 두 개의 백 슬래시. 에코가 일을 할 때

그러나 문제가있다가 ..., t 뒤에 백 슬래시 출력에게 탭을 의미, 백 슬래시 뒤에 백 슬래시 출력 백 슬래시를 의미합니다 ...하지만 그렇지 않은 조합이 많이 있습니다 무엇이든을 의미합니다. 예를 들어 백 슬래시 뒤에 T이 오는 것은 유효한 이스케이프 시퀀스가 ​​아닙니다. C에서는 경고 또는 오류가 발생합니다. 그러나 echo 명령은 좀 더 관대 해 지려고합니다.

echo \\T 또는 echo '\T'을 시도하면 백 슬래시 뒤에 백 슬래시 이스케이프로 정의 된 의미가없는 문자가 있으면 두 문자가 그대로 출력됩니다.

지난 경우 우리에게 가져다

: 백 슬래시가 전혀 아무것도 다음에하지 무슨 경우? 인수 단어의 마지막 문자라면 어떨까요? 이 경우 에코는 백 슬래시를 출력합니다.

요약하면 인수 단어에 두 개의 백 슬래시가 있으면 결과에 백 슬래시가 하나 있습니다. 이 단어 또는 다음 문자와 함께 백 슬래시가 유효한 이스케이프 시퀀스를 형성하지 않는 경우 마지막 문자 인 경우 그러나 인수 단어 하나의 백 슬래시는 또한, 출력에 하나의 백 슬래시에 결과.

명령 행 echo \\\\ 따라서 단어리스트의 모든 수준에서 적용 인용이 단일 백 슬래시 "적절"을 출력한다

echo 
\\ 

된다.

명령 줄 echo \\는 단어 목록을하게

에코도 당신을 위해 그것을 인수의 끝에서 길 잃은 백 슬래시를 발견하고 출력에 충분히 관대했기 때문에 출력 "messily"단일 백 슬래시,
echo 
\ 

그것은 도주되지 않았지만.

나머지 예제는이 원칙에서 분명해야합니다.