Todos os nomes de letras maiúsculas nesta seção referem-se a descrições (possivelmente compiláveis por máquina) lex
da gramática (iniciando em 2.10. Gramática da Shell ). O recurso perguntado é esclarecido no item 5:
[
NAME
infor
]
Quando o TOKEN
atende aos requisitos de um nome (consulte XBD Name ), o identificador de token NAME
será o resultado. Caso contrário, o token WORD
será retornado.
Isso é (referindo-se a 3.231 Name ), um NAME
é um determinado tipo de WORD
:
In the shell command language, a word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit.
Nem todas as palavras são nomes: um inteiro decimal é uma palavra, mas não um nome.
Em relação à gramática, essas linhas informam yacc
quais constantes simbólicas (via #define
) lex
podem retornar:
%token WORD
%token ASSIGNMENT_WORD
%token NAME
%token NEWLINE
%token IO_NUMBER
enquanto a gramática yacc
(regras) começa com
%start complete_command
Você pode perceber ocorrências de WORD
e NAME
na gramática. yacc
espera que lex
retorne as constantes simbólicas nesses pontos. Convencionalmente, nomes maiúsculos são usados para essa finalidade, com outros nomes sendo apenas as regras dentro da yacc
gramática.
Ao interpretar um comando, o interpretador de shell só se preocupa com o primeiro WORD, que ele espera ser um NAME. Ele passa as outras WORDs para o comando como parâmetros, e o comando tem que decidir o que isso significa. A gramática yacc
é vaga nessa área, mas observe a referência a "7a". Não há nenhum item rotulado para isso no padrão escrito, mas é devolvido a 2.9. 1 Comandos simples correspondendo a este clump na gramática:
simple_command : cmd_prefix cmd_word cmd_suffix
| cmd_prefix cmd_word
| cmd_prefix
| cmd_name cmd_suffix
| cmd_name
(como exercício, alguém pode tentar completar a gramática e torná-la realmente compatível com o padrão em relação à terminologia).