첫 번째 단계에서 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
\
그것은 도주되지 않았지만.
나머지 예제는이 원칙에서 분명해야합니다.