부록 C. 명령줄 처리
이 책에서 우리는 셸이 입력 줄을 처리하는 다양한 방법, 특히 읽기를 사용하는 방법을 살펴봤습니다. 이 프로세스는 셸이 명령줄을 처리할 때 수행하는 작업의 하위 집합으로 생각할 수 있습니다. 이 부록에서는 명령줄 처리와 관련된 단계에 대한 자세한 설명과 bash가 평가로 두 번째 패스를 수행하는 방법을 제공합니다. 이 부록의 자료는 Cameron Newham(O'Reilly)이 집필한 bash 셸 배우기, 3판에도 나와 있습니다.
명령줄 처리 단계
이 책 전체에서 명령줄 처리에 대해 다뤘는데, 작은따옴표(''), 큰따옴표("") 및 백슬래시(\), 한 줄의 문자를 단어로 구분하는 방법, 심지어 환경 변수 $IFS 를 통해 사용하는 구분 기호를 지정하는 방법, 단어를 셸 변수(예: $1, $2 등)에 할당하는 방법, 파일이나 다른 프로세스(파이프라인)로 입력 및 출력을 리디렉션하는 방법 등에 대해 언급했죠. 셸 스크립팅의 진정한 전문가가 되려면(또는 까다로운 문제를 디버깅하려면) 명령줄 처리와 관련된 다양한 단계, 특히 그 순서를 이해해야 합니다.
셸이 STDIN 또는 스크립트에서 읽는 각 줄은 0개 이상의 파이프 문자로 구분된 하나 이상의 명령을 포함하므로 파이프라인이라고 합니다(|). 그림 C-1은 명령줄 처리의 단계를 보여줍니다.
그림 C-1. 명령줄 처리 단계
읽은 각 파이프라인에 대해 셸은 이를 명령으로 나누고 파이프라인의 I/O를 설정한 다음 각 명령에 대해 다음을 수행합니다:
-
명령을 스페이스, 탭, 개행,
;,(,),<,>,|,&의 고정된 메타문자 집합으로 구분되는 토큰으로 분할합니다. 토큰 유형에는 단어, 키워드, I/O 리디렉터, 세미콜론 등이 있습니다. -
각 명령의 첫 번째 토큰을 확인하여 따옴표나 백슬래시가 없는 키워드인지 확인합니다.
if또는 다른 제어 구조 오프너인function,{,(과 같은 시작 키워드인 경우 해당 명령은 실제로 복합 명령입니다. 셸은 내부적으로 복합 명령에 대한 설정을 하고 다음 명령을 읽은 후 프로세스를 다시 시작합니다. 키워드가 복합 명령 오프너가 아닌 경우(예:then,else, 또는do와 같은 제어 구조 "중간",fi또는done와 같은 "끝", 또는 논리 연산자) 셸은 구문 오류를 알립니다. -
각 명령의 첫 단어를 별칭 목록과 비교하여 확인합니다. 일치하는 단어가 발견되면 별칭의 정의를 대체하고 1단계로 돌아가며, 그렇지 않으면 4단계로 이동합니다. 이 방식은 재귀적 별칭을 허용하며 키워드를 정의할 수 있습니다(예:
alias aslongas=while또는alias procedure=function). -
중괄호 확장을 수행합니다. 예를 들어
a{b,c}은ab ac이 됩니다. -
사용자의 홈 디렉터리(
$HOME)가 단어의 시작 부분에 ...