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:
[
NAMEinfor]
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).