TL; DR : POSIX 괄호 그룹에 {
예약어 뒤에 공백이 필요 하지만 서브 쉘에 예약어 뒤에 공백이 필요한 이유는 무엇 (
입니까?
POSIX 쉘 문법은 다음과 같이 중괄호 그룹과 서브 쉘을 정의합니다.
brace_group : Lbrace compound_list Rbrace
subshell : '(' compound_list ')'
이제 문자 그대로 읽으면 공백이 중요합니다. 이것은 다음과 같이 여는 중괄호와 괄호를 나타내는 공간이 있어야 함을 의미합니다.
{ echo hello world; }
( echo hello world )
이러한 복합 명령 각각에는 시작 부분에 예약어 또는 제어 연산자가 있고 끝에 해당 터미네이터 예약어 또는 연산자가 있습니다.
그러나하지 않습니다 어떤 의미가 이유 (list)
와 ( list )
잘 (공간 후에는 그 일 (
즉, 그러나 중괄호 확장은 선도적 인 공간을 가지고 있어야 필요하지 않습니다) {echo hello;}
작동하지 않을 것입니다.
물론 셸 단어로 취급되는 예약어는 필드 분할 개념과 정렬하기 위해 공백이 필요하다는 것은 당연 하지만 정의 자체는 공백을 언급하지 않습니다. 또한 복합 명령의 POSIX 정의에 의해 예약어로 간주되고 예약어 인 경우 {
, (
예약어 뒤에 공백 문자와 관련하여 다르게 취급되는 이유는 무엇입니까? 이제 ksh (1) 매뉴얼의 상태는 다음과 같습니다.
일련의 문자 인 단어는 따옴표없는 공백 문자 (공백, 탭 및 줄 바꿈) 또는 메타 문자 (<,>, |,;, &, (및))로 구분됩니다.
다시 말해, ksh는 (
단어 구분 기호로 인식 되며, 첫 번째 단어는 명령 또는 변수 할당입니다. 그러나 POSIX (
는 메타 문자 로 언급되지 않습니다 . POSIX 문법에 관한 한 가능한 설명 {
은 "토큰"으로 간주되는데, 여기에 (
나열되지 않습니다.
/* These are reserved words, not operator tokens, and are
recognized when reserved words are recognized. */
%token Lbrace Rbrace Bang
/* '{' '}' '!' */
이 불일치에 대한 정확한 추론은 무엇입니까?
허용되는 답변 메모 :
에 허용 체크 이전 이삭의 대답 은 q를 제공하기 때문에 표준 형성 uote 직접 내 질문을 해결 자체를 :
예를 들어, '('및 ')'는 제어 연산자이므로
<space>
(list)에는 필요 하지 않습니다 . 그러나 '{'및 '}'은 {list;}에서 예약어이므로이 경우 선행<space>
및<semicolon>
필수입니다.Kusalananda의 답변 수락. Kusalananda의 답변은 대부분 비공식적이고 직관적 인 관점에서 필자에게 필요한 것을 설명합니다. 그것은{
예약어이며 지적(
입니다. Michael Homer는 또한 의견에서 복합 명령 정의 상태 (강조 추가)에 대해서도 동일하게 언급했습니다.이러한 각 복합 명령에는 처음에 예약어 또는 제어 연산자 가 있습니다.
{
유사 예약 된 단어로 정의for
또는while
쉘 문법에 나열된, (질문의 마지막 코드 블록을 참조)섹션 2.9 상태 (강조 추가) :
특히, 표현에는 토큰 이 필요하지 않은 곳 (토큰 중 하나가 연산자 인 경우)에서 토큰 사이의 간격이 포함됩니다 .
<blank>
표준은 명시 적으로
(
연산자로 정의되지 않지만 연산자(
라고합니다. 구체적으로, 섹션 2.9.2 는파이프 라인이 예약어! 그리고 command1은 서브 쉘 명령이며, 응용 프로그램은 (command1의 시작 부분에있는 연산자가 하나 이상의 문자로!와 분리되어 있는지 확인해야합니다.) 예약어!
Digital Trauma의 스택 오버플로 에 관한 질문은 예약어에 관한 2.4 절을 지적합니다.
이 인식은 문자를 인용하지 않고 단어를 다음과 같이 사용하는 경우에만 발생합니다.
-명령의 첫 단어
Kusalananda의 답변에서 언급했듯이 "POSIX 문법에 표시된 공백은 쉘 입력 데이터에 있어야하는 공백이 아니라 문법 자체를 표시하는 방법 일뿐입니다. 중괄호는 예약어입니다. 마이클 호머 (Michael Homer )가 논평에서 언급 한대로 "공백이 중요하다면 공간을 생산 에 포함시켜야합니다. "
경우 폐쇄.
{
및 (
화합물 명령 POSIX 정의에 의해 모두 고려 예약어"참조 "이러한 각 복합 명령에는 처음에 예약어 또는 제어 연산자 가 있습니다."
' '
) 를 포함해야한다고 생각 합니다. 대신 공백은 토큰이 단어라는 의미로 암시됩니다.
command : simple_command | compound_command | compound_command redirect_list | function_definition ;
당신이 명령을 가질 수있는, 그것은 간단한 명령, 화합물 명령 또는 리디렉션 화합물 명령 또는 함수 정의 중 하나가 될 수 있다고하는 생산이다.