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.