Bash의 우아한 단순함은 거대한 맨 페이지에서 잃어버린 것 같습니다.
위의 우수한 솔루션 외에도 bash가 구문을 구문 분석하고 해석하는 방법 에 대한 치트 시트를 제공하려고 생각했습니다 . 그런 다음이 로드맵을 사용하여 질문자가 제시 한 예제를 구문 분석하여 의도 한대로 작동하지 않는 이유를 더 잘 이해할 수 있도록하겠습니다.
참고 : 셸 스크립트 줄이 직접 사용됩니다. 입력 된 입력 줄이 먼저 기록 확장됩니다.
각 bash 라인은 먼저 토큰 화 되거나, 다시 말해서 tokens 로 잘립니다 . (토큰 화는 중괄호, 물결표, 매개 변수, 명령, 산술, 프로세스, 단어 분할 및 파일 이름 확장을 포함한 다른 모든 확장 전에 발생합니다.)
여기서 토큰은 입력 줄에서이 특수 메타 문자 중 하나로 구분 (구분) 된 부분을 의미합니다.
space, - White space...
tab,
newline,
‘<’, - Redirection & piping...
‘|’,
‘>’
‘&’, - And/Both < | > | >> .or. &<file descriptor>
‘;’, - Command termination
‘(’, - Subshell, closed by - ‘)’
Bash는 다른 많은 특수 문자를 사용하지만이 10 개만 초기 토큰을 생성합니다.
그러나 이러한 메타 문자도 때때로 토큰 내에서 사용해야하므로 특별한 의미를 빼앗을 방법이 필요합니다. 이를 탈출이라고합니다. (즉, 하나 이상의 문자열을 인용하여 중 하나를 수행 탈출 'xx..'
, "xx.."
) 또는 백 슬래시 (즉, 함께 개별 문자를 앞에 붙여 \x
). 따옴표도 따옴표로 묶어야하고 큰 따옴표는 모든 것을 따옴표로 묶지 않기 때문에 이보다 조금 더 복잡합니다. 그러나이 단순화는 현재 가능합니다.
bash 인용을 다른 언어와 같이 텍스트 문자열을 인용하는 아이디어와 혼동하지 마십시오. bash에서 따옴표 사이에있는 것은 문자열이 아니라 메타 문자가 이스케이프 된 입력 줄의 섹션이므로 토큰을 구분하지 않습니다.
'
와 "
, 사이에는 중요한 차이점이 있지만 다른 날입니다.
나머지 이스케이프되지 않은 메타 문자는 토큰 구분 기호가됩니다.
예를 들어
$ echo "x"'y'\g
xyg
$ echo "<"'|'\>
<|>
$ echo x\; echo y
x; echo y
첫 번째 예에서는이 공간 구분에 의해 생산이 토큰은 다음과 같습니다 echo
및 xyz
.
두 번째 예에서도 마찬가지입니다.
세미콜론 이스케이프 제 3 실시 예에서, 이렇게 공간 분리에 의해 생성 된 토큰이있다 4 echo
, x;
, echo
, 및 y
. 그런 다음 첫 번째 토큰이 명령으로 실행되고 다음 세 개의 토큰이 입력으로 사용됩니다. 두 번째 echo
는 실행되지 않습니다.
기억해야 할 중요한 것은 이스케이프 문자 그 bash에 처음 모습이다 ( '
, "
, 및 \
), 다음 순서대로, 이스케이프 메타 문자 구분 기호를 찾습니다.
이스케이프되지 않으면이 10 개의 특수 문자는 token
구분 기호로 사용됩니다. 그들 중 일부는 추가 의미가 있지만 무엇보다도 토큰 구분 기호입니다.
grep이 기대하는 것
GREP 위의 예는이 토큰을 필요에, grep
, string
, filename
.
첫 번째 시도는 다음과 같습니다.
$ grep (그럼) xx
이 경우 (
, )
및 |
이스케이프 메타 문자입니다 그래서 이러한 토큰으로 입력을 분할하는 역할 : grep
, (
, then
, |
, there
, )
,와 x.x
. 그렙이보고 싶어 grep
, then|there
하고 x.x
.
질문의 두 번째 시도는 다음과 같습니다.
grep "(그럼)"xx
이것은으로 토큰 화 grep
, (then|there)
, x.x
. 에코를 grep으로 바꾸면 다음과 같이 표시됩니다.
echo "(그럼)"xx
(그럼) xx