Bash 매뉴얼에 따르면
{ list; }
중괄호 사이에 명령 목록을 배치하면 해당 목록이 현재 셸의 컨텍스트에서 실행됩니다. 하위 쉘이 생성되지 않습니다.목록 뒤에는 세미콜론(또는 개행)이 필요합니다.
중괄호는 예약어이므로 공백이나 기타 쉘 메타 문자로 목록과 구분해야 합니다.
괄호는 공백으로 목록과 구분되지 않더라도 쉘에서 별도의 토큰으로 인식되는 연산자입니다.
다음과 같이 세미콜론을 제거하면:
$ { date }
>
표준 입력이 필요한 이유는 무엇입니까?
메타문자는 단어를 구분하는 문자입니다. 세미콜론과 공백은 "셸 메타 문자"입니다. 왜 단어
date
와 공백을 구분할 수 없나요}
? 단어를 구분하기 위해 공백 대신 세미콜론이 필요한 이유는 무엇입니까?
답변1
마감을 기다리고 있습니다
}
. 명령과 개행 문자가 포함된 목록을 입력했으므로date }
여전히 명령 그룹 내에 있으므로 목록에 다른 명령을 추가하거나 종료할 수 있습니다.따라서 표준 입력(정확히)을 기다리는 대신 첫 번째 줄에서 시작한 명령이 완료되기를 기다립니다. 여기에 입력 하면
}
명령에서date
" "을(를) 이해하지 못한다는 오류 메시지가 표시 될 것입니다}
.{
}
포인트 1에 표시된 대로 일반 명령에 대한 유효한 매개변수입니다 . 예를 들어,find
매개변수 로 사용됩니다{}
.구체적으로 "
{
" 및 "}
"만 해당됩니다.예약어. 셸의 예약어는 전체 단어 그대로 제공되고 특별히 필요한 경우에만 의미가 있습니다. 그들이 기대하는 가장 중요한 것은시작명령.}
목록의 다음 명령 시작 부분 에 나타나는 세미콜론이나 개행 문자는 예약어로 인식되어 특별하게 처리될 수 있습니다. 이것쉘 구문에 대해 POSIX에서 지정됨:<newline>
이 규칙은 또한 a 또는<semicolon>
; 뒤와 같이 입력의 특정 위치를 제외하고는 예약어가 인식되지 않음을 의미합니다 . 문법은 예약어를 의도한 경우 사용자가 이를 올바르게 구분했다고 가정합니다.다른 예약어 "then"을 일반 단어로 사용할 수 없다면 짜증나는 일이 될 것이므로 기본적으로 이는 의미가 있습니다. 대조적으로,
(
and)
는 어디에나 나타날 수 있고 리터럴 값에 사용되는 경우 이스케이프해야 하는 연산자입니다. 이는 본질적으로 역사적인 유물이며, 다시 수행할 경우 한 방향 또는 다른 방향으로 보다 일관된 선택이 이루어지거나 보다 복잡한 파서가 필요할 수 있습니다.
특히 Bash의 경우 명령 그룹화 괄호도 다음과 동일해야 합니다.버팀대 확장, 파서는 공백으로 시작하는 명령을 중괄호로 확장할 가능성이 없다고 가정합니다.
극단적인 경우에 대한 과거 호환성을 유지하는 것은 선택 사항이며 일부 다른 셸(예: zsh)에는 더 똑똑한 파서가 있어 { date }
원하는 의미를 처리할 수 있습니다.
답변2
명령이 완료되기를 기다리고 있습니다. 불완전한 if 또는 while 또는 무엇이든 작성하는 경우에도 동일한 일이 발생합니다.
$ if date >
명령은 매뉴얼에 명확하게 정의되어 있습니다. A는
{ list; }
복합 명령입니다.복합 명령
{ list; } 목록은 줄바꿈이나 세미콜론으로 끝나야 합니다.
거기에는 "개행 또는 세미콜론으로 종료"라고 명확하게 나와 있습니다.