~에서Bash가 쉘 내장 명령 대신 외부 `time` 명령을 사용하도록 합니다., Stefan Chazeras는 다음과 같이 썼습니다.
time
내장된 bash 가 없습니다 .time
키워드이므로 다음을 수행할 수 있습니다.time { foo; bar; }
우리는 그것을 확인할 수 있습니다:
$ type -a time
time is a shell keyword
time is /usr/bin/time
time
이것이 내장 명령일 수 있음 을 나타내지는 않습니다 .
"키워드"의 정의는 무엇입니까?
"키워드"는 Bash 참조 매뉴얼의 "예약어"와 동일한 개념입니까?
예약어
이 단어는 쉘에 대해 특별한 의미를 갖습니다. 대부분의 예약어는
for
및 와 같은 셸 흐름 제어 구조를 도입합니다while
.키워드는 명령(또는 내장 명령)이 아니어야 합니까?
명령이 아닌 키워드로
time
(또는 내장 명령이 아님)?키워드와 내장 기능의 정의를 고려할 때
time
내장 기능이 아닌 키워드가 필요한 이유는 무엇입니까?" 가 키워드이기
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
있습니다 .if
while
time
예, 동일합니다.
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 확장입니다.