Qual é a definição de um primário em bash?

4

Do manual do Bash

6.4 Bash Conditional Expressions

Conditional expressions are used by the [[ compound command and the test and [ builtin commands.

Expressions may be unary or binary. Unary expressions are often used to examine the status of a file. There are string operators and numeric comparison operators as well. If the file argument to one of the primaries is of the form /dev/fd/N, then file descriptor N is checked. If the file argument to one of the primaries is one of /dev/stdin, /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2, respectively, is checked.

When used with [[, the ‘<’ and ‘>’ operators sort lexicographically using the current locale. The test command uses ASCII ordering.

Unless otherwise specified, primaries that operate on files follow symbolic links and operate on the target of the link, rather than the link itself.

Qual é a definição de um primário?

Qual é a diferença entre um primário e um operador ou operação?

    
por Tim 10.01.2016 / 15:10

3 respostas

4

Como observado, este é o jargão. O manual de referência da bash não define o termo; presume-se que o leitor saiba disso.

Você pode facilmente encontrá-lo usado para operandos em uma expressão aritmética. Veja, por exemplo, Expressões Aritméticas em um Manual de referência de linguagem do Fortran 77 , que diz

A primary is the basic component in an arithmetic expression. The forms of a primary are the following:

  • an unsigned arithmetic constant

  • a symbolic name of an arithmetic constant

  • an arithmetic variable reference

  • an arithmetic array element reference

  • an arithmetic function reference

  • an arithmetic expression enclosed in parentheses

No POSIX, ele é (ainda) usado principalmente com base no conhecimento prévio do leitor sobre o termo. Por exemplo, na linguagem de comandos shell, refere-se às primárias do find comando:

(such as in the argument to the find - name primary when find is being called using one of the exec functions as defined in the System Interfaces volume of POSIX.1-2008, or in the pattern argument to the fnmatch() function),

e ao ler a essa seção , fica evidente que as primárias significa o mesmo que operandos. Ou seja, em cada nível de análise de comando, o comando (ou primário) tem algumas primárias adicionais a considerar até que tudo o que resta sejam constantes ou variáveis: também conhecido como "operando".

    
por 10.01.2016 / 16:31
2

O termo parece ser usado de forma ambígua. Parece que quer dizer

  • um operador ou
  • um operador, combinado com um ou dois operandos, conforme apropriado, para produzir um valor booleano

Referências:

O Manual de referência do Bash , Seção 3.2.4.2 Construções Condicionais , falando sobre [[]] diz:

…  Expressions are composed of the primaries described below in Bash Conditional Expressions.  …

qual é a seção um pouco confusa que você cita em sua pergunta. Ele continua listando -a file , -b file ,…, -t fd ,…, file1 -ef file2 ,…, -z string ,…, string1 != string2 , etc.

E a especificação POSIX para o comando test , seção OPERANDES (obrigado, BinaryZebra, por identificar essa fonte) diz,

The primaries with two elements of the form:
    -primary_operator primary_operand
are known as unary primaries.  The primaries with three elements in either of the two forms:
    primary_operand -primary_operator primary_operand

    primary_operand primary_operator primary_operand
are known as binary primaries.  …

Então, essas duas fontes parecem concordar que -b file , -c file , etc. são as primárias. Mas você está certo; quando a seção 6.4 do manual de referência fala sobre “O argumento arquivo para uma das primárias,” certamente parece que está se referindo aos operadores (por exemplo, -b , -c ,…) como primárias.

    
por 10.01.2016 / 22:14
2

Resposta curta (minhas palavras):

A "palavra" (s) que existe dentro do teste ( [[ e ]] , ou [ e ] ) após dividi-la em espaços se torna primários. As palavras podem ser ( ! ), ( -f ) ou valores ( $var ). Essas palavras também são "os argumentos" se o primeiro [ ou [[ for entendido como um comando ("teste").

Após a divisão, (algumas) duas palavras juntas. Como (-f) e ($ var) são chamados de "primários unários". E (algumas) três palavras são chamadas de "primária binária".

Mas essa descrição não é tão precisa em alguns usos e vagueia um pouco.

Resposta mais longa:

O conceito é bem antigo (do Bourne shell) e é detalhado na especificação POSIX (como um exemplo) :

OPERANDS
The application shall ensure that all operators and elements of primaries are presented as separate arguments to the test utility.
The following primaries can be used to construct expression:

expressão significa o que está dentro de chaves: [expression] .

Note que aqui operandos e são ambos os argumentos (palavras divididas em espaços) dados ao utilitário de teste.

O conceito de expressão também é usado em man bash , por exemplo, próximo ao início, procure por [[ expression ]] (uma forma de "comandos compostos"):

Expressions are composed of the primaries described below under CONDITIONAL EXPRESSIONS.
Conditional operators such as -f must be unquoted to be recognized as primaries.

Final

E, finalmente, você pode pesquisar na página de especificações POSIX vinculada acima e novamente aqui para esta linha (e linhas seguintes):

The primaries with two elements of the form:
-primary_operator primary_operand
are known as unary primaries.

As linhas seguintes fazem uma tentativa de definir primárias com expressões que tenham até 4 argumentos (palavras divididas por espaços, onde comecei).

Não há 4 primárias de palavras (se ! não for contado como parte de uma palavra primária (negada) de três palavras).

Essa descrição POSIX não funciona bem em muitos casos de canto e é o principal motivo para desenvolver o [[ ]] incorporado.

    
por 10.01.2016 / 20:08

Tags