os resultados de echo $ (FOO = bar foobar) não são especificados em um shell POSIX?

0

Estou tentando entender o padrão de shell POSIX aqui

Ao lê-lo, aparece para mim no seguinte comando shell:

echo $(FOO=bar foobar)

existem dois tokens (para o shell de nível superior, não o subshell): echo e $(FOO=bar foobar)

Este é um tipo útil de comando e não planejado, portanto, deve-se definir quais são os resultados. Mas quando você tenta analisá-lo usando a gramática dada no padrão, o segundo token não é especificado pela Regra 7b da gramática - porque contém = , mas antes disso, não é um nome válido.

Os resultados de tal comando "normal" não são realmente especificados? Ou o que não estou entendendo?

    
por Mark Galeck 05.08.2016 / 10:43

1 resposta

1

Sim, echo $(FOO=bar foobar) tem dois tokens: echo e $(FOO=bar foobar) .

O primeiro token é um comando, o segundo é uma expansão $(…) .

O comando é reconhecido no passo 1

A expansão é reconhecida no passo 5

If the current character is an unquoted '$' or ''', the shell shall identify the start of any candidates for parameter expansion (Parameter Expansion), command substitution (Command Substitution) …

A " Substituição de comandos " para ser mais preciso:

… Command substitution shall occur when the command is enclosed as follows:

$(command)

The shell shall expand the command substitution by executing command in a subshell environment and replacing the command substitution (the text of command plus the enclosing "$()" or backquotes) with the standard output of the command

With the $(command) form, all characters following the open parenthesis to the matching closing parenthesis constitute the command.

Portanto, é claro que o comando a ser executado em um sub-shell seria:

FOO=bar foobar

Que também possui dois tokens: uma atribuição de variável ( FOO=bar ) e um comando ( foobar ).

O resultado da execução desse comando substituirá todo o $(…) .

Essa é toda a sintaxe POSIX válida, não consigo ver nenhum problema.

    
por 06.08.2016 / 03:40

Tags