Diferenças entre palavra-chave, palavra reservada e interna?

6

De Faça uma festança use o comando externo 'time' ao invés de shell embutido , Stéphane Chazelas escreveu:

There is no time bash builtin. time is a keyword so you can do for instance time { foo; bar; }

Podemos verificar:

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

Ele não mostra que time pode ser um comando interno.

  1. Qual é a definição de uma "palavra-chave"?
  2. é "keyword" o mesmo conceito que "reserved word" no Bash Reference Manual?

    reserved word

    A word that has a special meaning to the shell. Most reserved words introduce shell fl ow control constructs, such as for and while.

  3. Uma palavra-chave não é necessariamente um comando (ou não é um comando interno)?

    Como palavra-chave, time não é um comando (ou não é um comando interno)?

    Com base nas definições de palavra-chave e de builtin, por que time não é uma construção, mas uma palavra-chave?

  4. Por que "você pode fazer por exemplo time { foo; bar; } " porque " time é uma palavra-chave"?

por Tim 05.03.2016 / 07:37

2 respostas

8

Palavra-chave, palavra reservada e interna são todas as "primeiras palavras" de um comando Simples. Pode ser colocado em dois grupos: Keyword e Builtin. Os dois são mutualmente exclusivos. Uma palavra (token) pode ser uma palavra-chave ou uma palavra-chave, mas não ambas.

Por que a "primeira palavra"

A partir da definição POSIX de "Comando simples" (ênfase minha):

A "simple command" is a sequence of optional variable assignments and redirections, in any sequence, optionally followed by words and redirections, terminated by a control operator.

2.- The words that are not variable assignments or redirections shall be expanded. If any fields remain following their expansion, the first field shall be considered the command name and remaining fields are the arguments for the command.

Depois que a "primeira palavra" tiver sido identificada e após ela ter sido expandida (por um alias, por exemplo), a palavra final é "o comando", pode haver apenas um comando em cada linha. Essa palavra de comando pode ser um Built-in ou uma palavra-chave.

Palavra-chave

Sim, uma palavra-chave é uma "palavra reservada". Carregue "man bash" e procure por palavra-chave. (ou apenas execute este comando: LESS=+/'keyword' man bash . O primeiro hit na pesquisa diz isso:

keyword Shell reserved words.

Isso acontece na seção de conclusão, mas é bem claro.

Palavras reservadas

No POSIX, há esta definição de "Palavras Reservadas" e algumas < a href="http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html#tag_23_02_04"> descrição do que as palavras reservadas fazem .

Mas o manual de bash tem uma melhor definição de trabalho.
Procure por "RESERVED WORDS" ( LESS=+/'RESERVED WORDS' man bash ) e encontre este:

RESERVED WORDS Reserved words are words that have a special meaning to the shell.
The following words are recognized as reserved when unquoted and either the first word of a simple command or the third word of a case or for command:

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

Builtin

Não está definido no manual do bash, mas é bastante simples:

É um comando que foi implementado dentro do shell para as necessidades evitáveis de shell da ONU (cd, pwd, eval) ou velocidade em geral ou para evitar interpretações conflitantes de utilitários externos em alguns casos.

O tempo é uma palavra-chave.

why is time not a builtin but a keyword?

Para permitir a existência de um comando como a segunda palavra.

É semelhante como um if ... then .... fi permite a inclusão de comandos (mesmo comandos compostos) após a primeira palavra-chave if . Ou while ou case , etc.

    
por 06.03.2016 / 00:15
1

Q1, Q2

What's the definition of a keyword?

Is "keyword" the same concept as "reserved word" in Bash Reference Manual?

Basicamente, palavras especiais são importantes para a estrutura sintática. Em C, existem goto , if , while , enum e assim por diante; no bash você tem if , while (soa familiar ..), time , etc.

E sim, eles são iguais.

Eu estou tomando alguma liberdade em interpretar a questão, já que os elementos sintáticos básicos do shell e do bash POSIX são similares. Então, vamos ver a definição em POSIX.1: Linguagem de Comando Shell 2013 :

2.4 Reserved Words

Reserved words are words that have special meaning to the shell; see Shell Commands. The following words shall be recognized as reserved words:

...

This recognition shall only occur when none of the characters is quoted and when the word is used as:

...

See the grammar in Shell Grammar.

Vamos dar uma olhada na gramática POSIX para ver como as palavras especiais - agora símbolos sintáticos após lexing - em ação:

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 */

Isso parece familiar, certo? Observe que For , Do e Done são realmente tokens que devem ser mapeados e reconhecidos pelo lexer:

%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'   */

Se você já ouviu falar sobre Yacc ou Bison (ou bem, jison), é assim que as pessoas podem usar a gramática. Com esses geradores de analisadores, eles podem gerar algo que determine em que partes da gramática um determinado fluxo de 'tokens' de entrada é falado.

Q3

Is a keyword necessarily not a command (or not a builtin command)?

As a keyword, is time not a command (or not a builtin command)?

Nenhuma das palavras-chave é tratada como comandos. Mas claro, você pode ter comandos / funções com o mesmo nome, por exemplo:

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

Based on the definitions of keyword and of builtin, why is time not a builtin but a keyword?

Porque é assim que as pessoas decidiram fazê-lo :

// 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;

E eles ganham poder extra com isso (veja a próxima pergunta).

Q4

Why "you can do for instance time { foo; bar; }" because "time is a keyword"?

Como parte da gramática, as pessoas podem naturalmente permitir que o analisador manipule tudo e tome decisões como permitir time antes dos comandos compostos. Se time foi implementado apenas como um comando, você receberá um erro de sintaxe para construções como essa (tente echo { foo; bar; } ), pois ele é realmente analisado com as regras 'usuais'.

Pense também em [[ . Se [[ não tiver sido uma palavra-chave, construções como [[ ($a == 2) || ($b != 3) ]] farão com que o shell encontre parênteses perdidos e queixem-se. (Substitua [[ por [ e veja).

P.S. time é um utilitário em vez de uma palavra-chave no POSIX, embora o último ainda seja considerado aceitável . Toda a coisa de time-a-trunk-of-commands é uma extensão de ksh e bash.

    
por 05.03.2016 / 22:24

Tags