키워드, 예약어, 내장어의 차이점은 무엇인가요?

키워드, 예약어, 내장어의 차이점은 무엇인가요?

~에서Bash가 쉘 내장 명령 대신 외부 `time` 명령을 사용하도록 합니다., Stefan Chazeras는 다음과 같이 썼습니다.

time내장된 bash 가 없습니다 . time키워드이므로 다음을 수행할 수 있습니다.time { foo; bar; }

우리는 그것을 확인할 수 있습니다:

$ type -a time
time is a shell keyword
time is /usr/bin/time

time이것이 내장 명령일 수 있음 을 나타내지는 않습니다 .

  1. "키워드"의 정의는 무엇입니까?

  2. "키워드"는 Bash 참조 매뉴얼의 "예약어"와 동일한 개념입니까?

    예약어

    이 단어는 쉘에 대해 특별한 의미를 갖습니다. 대부분의 예약어는 for및 와 같은 셸 흐름 제어 구조를 도입합니다 while.

  3. 키워드는 명령(또는 내장 명령)이 아니어야 합니까?

    명령이 아닌 키워드로 time(또는 내장 명령이 아님)?

    키워드와 내장 기능의 정의를 고려할 때 time 내장 기능이 아닌 키워드가 필요한 이유는 무엇입니까?

  4. " 가 키워드이기 time { foo; bar; }때문에 "할 수 있다"는 이유는 무엇입니까 ?time

답변1

키워드, 예약어 및 내장 명령은 간단한 명령의 "첫 번째 단어"입니다. 키워드와 내장 함수라는 두 그룹으로 나눌 수 있습니다. 둘은 상호 배타적이다. 단어(태그)는 키워드 또는 내장 단어일 수 있지만 둘 다일 수는 없습니다.

왜 "첫 번째 단어"입니까?

~에서"간단한 명령"의 POSIX 정의(강조):

"간단한 명령"은 임의의 순서로 선택적인 변수 할당 및 리디렉션의 시퀀스이며 선택적으로 단어와 리디렉션이 뒤따르고 제어 연산자에 의해 종료됩니다.

2.- 변수 할당이나 방향 재지정이 아닌 단어는 확장되어야 합니다. 확장 후에도 필드가 여전히 존재하는 경우첫 번째 필드는 명령 이름으로 처리되어야 합니다.나머지 필드는 명령에 대한 매개변수입니다.

"첫 번째 단어"가 식별되고 확장되면(예: 별칭을 통해) 마지막 단어는 "command"가 되며 한 줄에 하나의 명령만 있을 수 있습니다. 명령 단어는 내장 명령이거나 키워드일 수 있습니다.

핵심 단어

예, 키워드는 "예약어"입니다. "man bash"를 로드하고 키워드를 검색하거나 다음 명령을 실행하십시오 LESS=+/'keyword' man bash.

검색의 첫 번째 클릭은 다음과 같습니다.

키워드 쉘 예약어.

완성된 부분에서 발생하지만 매우 명확합니다.

예약어

POSIX에는"예약어"의 정의좀 남았어예약어의 역할에 대한 설명.

그러나 Bash 매뉴얼에는 더 나은 작업 정의가 있습니다. "예약어"( LESS=+/'RESERVED WORDS' man bash)를 검색하고 다음을 찾으세요.

예약어 예약어는 쉘에 특별한 의미를 갖는 단어입니다. 다음 단어는 인용되지 않은 경우와 간단한 명령의 첫 번째 단어, 대소문자 또는 명령의 세 번째 단어인 경우 예약된 것으로 인식됩니다.

! case do done elif else esac fi for function if in select then until while { } time [[ ]]

내장

Bash 매뉴얼에는 정의되어 있지 않지만 매우 간단합니다.

셸의 기본 요구 사항(cd, pwd, eval)을 충족하거나 일반적인 속도를 충족하거나 경우에 따라 외부 유틸리티에 의한 해석과의 충돌을 피하기 위해 셸 내부에서 구현되는 명령입니다.

시간이 키워드다

왜 시간은 내장된 것이 아니라 키워드일까요?

명령이 두 번째 단어로 존재할 수 있도록 합니다.

if ... then .... fi이는 첫 번째 키워드 뒤에 명령(복합 명령도 포함)을 포함할 수 있는 방법과 유사합니다 if. 아니면 while등등 case.

답변2

1분기, 2분기

키워드 정의

"키워드"는 Bash 참조 매뉴얼의 "예약어"와 동일한 개념입니까?

기본적으로 구문 구조에는 특수 단어가 중요합니다. C에는 goto, if, 등 while이 있습니다 . bash에는 , (익숙하게 들립니다...) 등이 enum있습니다 .ifwhiletime

예, 동일합니다.

POSIX 쉘과 bash의 기본 구문 요소가 유사하기 때문에 이 질문을 해석하는 데 어느 정도 자유도가 있습니다. 그럼 정의를 살펴보겠습니다.POSIX.1:2013 쉘 명령 언어:

2.4예약어

예약어는 쉘에 특별한 의미를 갖는 단어입니다.쉘 명령. 다음 단어는 예약어로 간주되어야 합니다.

...

이 인식은 문자가 인용되지 않고 단어가 다음과 같이 사용되는 경우에만 발생합니다.

...

문법 보기쉘 구문.

특수 단어(이제는 어휘적으로 분석된 구문 토큰)가 어떻게 작동하는지 알아보기 위해 POSIX 구문을 살펴보겠습니다.

for_clause       : For name linebreak                            do_group
                 | For name linebreak in          sequential_sep do_group
                 | For name linebreak in wordlist sequential_sep do_group
/* ... */
do_group         : Do compound_list Done           /* Apply rule 6 */

이거 낯익은 것 같죠? For, Do및 는 실제로 Done어휘 분석기에 의해 매핑되고 인식되어야 하는 토큰입니다.

%token  If    Then    Else    Elif    Fi    Do    Done
/*      'if'  'then'  'else'  'elif'  'fi'  'do'  'done'   */


%token  Case    Esac    While    Until    For
/*      'case'  'esac'  'while'  'until'  'for'   */

/* and 'In' too -- They made a mistake! */
%token  In    /*      'in'   */

당신이 들어 본 적이 있다면자크또는바이슨(또는 jison), 그것이 사람들이 문법을 사용하는 방식입니다. 이러한 파서 생성기를 사용하면 주어진 입력 "토큰" 스트림에서 문법의 어느 부분이 사용되는지 알아내는 무언가를 생성할 수 있습니다.

3분기

키워드는 명령(또는 내장 명령)이 아니어야 합니까?

명령이 아닌 키워드로 time(또는 내장 명령이 아님)?

어떤 키워드도 명령으로 간주되지 않습니다. 그러나 물론 다음과 같이 동일한 이름을 가진 명령/함수를 사용할 수 있습니다.

# make a command to avoid command-not-found for `FOO=BAR time cmd`
time(){ time "$@"; }

키워드와 내장 함수의 정의에 따르면 왜 시간은 내장 함수가 아니라 키워드일까요?

왜냐하면 그게 다야사람들은 그것을 하기로 결정했다:

// Licensed under GPLv2, bash:parse.y
// Copyright (C) 1989-2012 Free Software Foundation, Inc.
pipeline_command: pipeline
                | BANG pipeline_command
                | timespec pipeline_command
                | timespec list_terminator
                | BANG list_terminator;
pipeline        : pipeline '|' newline_list pipeline
                | pipeline BAR_AND newline_list pipeline
                | command;
timespec        : TIME | TIME TIMEOPT | TIME TIMEOPT TIMEIGN;

그들은 그것으로부터 추가적인 힘을 얻습니다(다음 질문 참조).

4 분기

" 가 키워드이기 time { foo; bar; }때문에 "할 수 있다"는 이유는 무엇입니까 ?time

문법의 일부로 자연스럽게 파서가 모든 것을 처리하고 time복합 명령 이전에 허용하는 것과 같은 결정을 내리도록 할 수 있습니다. time명령으로만 구현된 경우 echo { foo; bar; }실제로 "일반적인" 규칙을 사용하여 구문 분석되므로 해당 구문에 대해 구문 오류(시도)가 발생합니다.

그것에 대해서도 생각해 보세요 [[. [[키워드가 아닌 경우 like를 구성하면 [[ ($a == 2) || ($b != 3) ]]쉘이 길 잃은 괄호를 찾아 불평하게 됩니다. (교체 [[하고 [참조하십시오).

PS time유용POSIX 키워드 대신 후자를 사용하는 것이 여전히 허용되는 것으로 간주됩니다. 전체 명령 트렁크는 ksh 및 bash 확장입니다.

관련 정보