Qual é o significado da regra “não é especificado se é ASSIGNMENT_WORD ou WORD” na gramática de shell POSIX?

2

Na gramática da shell POSIX em link

a regra 7b contém a declaração

Otherwise, it is unspecified whether it is ASSIGNMENT_WORD or WORD that is returned.

O que isso significa? Isso significa que um shell compatível, para cada token de palavra em que o lado esquerdo de = não está vazio e não é um nome válido, por exemplo:

,=

deve classificá-lo como ASSIGNMENT_WORD ou WORD , mas não retorna um erro?

    
por Mark Galeck 05.08.2016 / 09:53

2 respostas

3

Não: é não especificado qual dos dois resultados normais seria retornado. Como não é especificado, uma implementação poderia gerar um erro (já que a especificação não menciona o que deve acontecer, apenas implica que há apenas duas opções), mas a especificação não diga que um desses dois deve acontecer. Simplesmente não diz.

Este tipo de texto é usado nos casos em que alguém tem em mente uma implementação (possivelmente hipotética) que pode diferir de outras implementações, e não há consenso para excluí-lo do padrão.

O termo está em 1.5 Terminologia :

não especificado

Describes the nature of a value or behavior not specified by POSIX.1-2008 which results from use of a valid program construct or valid data input.

The value or behavior may vary among implementations that conform to POSIX.1-2008. An application should not rely on the existence or validity of the value or behavior. An application that relies on any particular value or behavior cannot be assured to be portable across conforming implementations.

É menos específico do que a implementação definida :

Describes a value or behavior that is not defined by POSIX.1-2008 but is selected by an implementor. The value or behavior may vary among implementations that conform to POSIX.1-2008. An application should not rely on the existence of the value or behavior. An application that relies on such a value or behavior cannot be assured to be portable across conforming implementations.

    
por 05.08.2016 / 10:20
1

Diz que:

  • foo=bar é uma palavra de atribuição
  • =foo é uma palavra
  • "foo"=bar ou foo.bar=baz pode ser uma palavra ou palavra de atribuição , POSIX não oferece garantias de nenhuma forma, então você não deve usá-la. / li>
  • parece implicar que "foo=bar" (com as aspas) também não é especificado, o que sugere que você não pode chamar (portably) um comando com um = em seu nome (diferente de cmd=foo=bar; "$cmd" ... ), que para mim parece ser um bug na especificação como nenhum shell que eu sei que trataria uma palavra com apenas citado = s como uma atribuição.

Naquelas não especificadas, ele diz que um desses dois deve acontecer porque ele não deixa outra escolha senão o token ser reconhecido como WORD ou _ASSIGNMENT_WORD_ .

Agora, isso está apenas descrevendo o estágio de tokenização.

Então, de acordo com a gramática, se é um WORD , então esse seria o nome do comando. O shell pode retornar um erro se o comando correspondente não for encontrado.

Se for um ASSIGNMENT_WORD , o shell ainda poderá retornar um erro se não puder atribuir uma variável com esse nome.

Na prática, você descobrirá que alguns shells permitem: Stéphane=1 ou foo.bar=baz como atribuição, outros não e os tratariam como nomes de comando. Algumas conchas as tratariam como uma tarefa falida.

    
por 05.08.2016 / 10:44

Tags