Como um metacaractere sem aspas pode fazer parte de um token?

3

Eu estava procurando na página bash man depois de ler algumas das perguntas de @ Tim sobre a gramática de shell, e eu criei uma questão (simples) por mim mesmo.

Aqui está um trecho de man bash (veja você mesmo em LESS=+/^DEFINITIONS man bash :

   word   A  sequence  of  characters  considered  as a single unit by the
          shell.  Also known as a token.
   ...
   metacharacter
          A character that, when unquoted, separates words.   One  of  the
          following:
          |  & ; ( ) < > space tab
   control operator
          A token that performs a control function.  It is one of the fol-
          lowing symbols:
          || & && ; ;; ( ) | <newline>

Mas aqui está o círculo que não estou conseguindo:

  • ; é um "metacaractere".
  • Um "metacaracter", quando não mencionado, separa "palavras".
  • "Token" é outro termo que podemos usar para "word".
  • ;; é um token.
  • Portanto, ;; é uma palavra.

Mas, isso significa que é uma palavra que consiste em dois separadores de palavras. Dado que é sem aspas e não requer espaços em branco para ser reconhecido (ou não?), Como isso é possível?

Se você está curioso, as outras perguntas sobre a gramática de shell que eu estava lendo são estas:

por Wildcard 18.03.2016 / 22:45

3 respostas

2

O Bash está usando a mesma terminologia do POSIX (sem surpresa). Use isso para comparação (e ocasionalmente esclarecimento).

Citações de Definições

3.113 Control Operator

In the shell command language, a token that performs a control function. It is one of the following symbols:

&   &&   (   )   ;   ;;   newline   |   ||

The end-of-input indicator used internally by the shell is also considered a control operator.

Note: Token Recognition is defined in detail in XCU Token Recognition .

3.407 Token

In the shell command language, a sequence of characters that the shell considers as a single unit when reading input. A token is either an operator or a word.

Note: The rules for reading input are defined in detail in XCU Token Recognition.

3.440 Word

In the shell command language, a token other than an operator. In some cases a word is also a portion of a word token: in the various forms of parameter expansion, such as ${name-word}, and variable assignment, such as name=word, the word is the portion of the token depicted by word. The concept of a word is no longer applicable following word expansions-only fields remain.

Note: For further information, see XCU Parameter Expansion and wordexp.

Então você vê, há uma distinção entre "palavra" e "token", e que eles não são sinônimos como implícitos na questão. Além disso, o padrão não considera os dois pontos-e-vírgulas como caracteres separados, mas uma unidade única .

    
por 18.03.2016 / 23:10
2

bash analisa os tokens gerados por um analisador léxico. Quando bash está quebrando linhas em palavras, provavelmente está usando caracteres. Quando está sintetizando o comando de análise, ele está usando tokens. Nesse caso, ;; não é dois ";" caracteres, em vez disso, é um token composto por dois ";" (ponto-e-vírgula) caracteres. O analisador léxico do bash lê o fluxo de caracteres de entrada de uma forma que permite identificar grupos de caracteres como tokens. Então o código não vê ponto-e-vírgula, ele vê códigos de token.

Veja as ferramentas flex e bison para ter uma idéia disso. Eu não acredito que o bash use isso, mas elas são ferramentas usadas para aplicativos de análise similares e há um material geral sobre como a análise é feita normalmente.

O Manual de Referência do GNU Bash é um bom documento para ler. Bem escrito, mas um pouco mais explicativo do que a man page.

    
por 18.03.2016 / 23:06
1

Sim, ;; é uma palavra. Mas não são dois metacaracteres juntos.
É o final de uma declaração de caso:

case a in 
    [a-z]) echo "yes" ;;
esac

Ou uma linha:

case a in [a-z]) echo "yes" ;; esac

E, sim, ele se separou do "sim" com um espaço, então é uma palavra.
Não precisa ser:

case a in [a-z]) echo "yes";; esac

Sim, a formulação de questões muito específicas pode ser confusa às vezes.

    
por 18.03.2016 / 23:10

Tags