A declaração citada não é verdadeira. Também não é verdade que a variável tenha sido pré-substituída antes que o subshell seja executado.
Você pode validar isso diretamente usando indireto de variável :
$ x=hello
$ echo Result is $(y=x ; echo ${!y} ; echo world)
Result is hello world
A variável x
está definitivamente disponível diretamente para o subshell (em vez de ter seu valor expandido anteriormente) porque ${!y}
lê a variável cujo nome é armazenado em y
- que não existia na época em que o subshell foi criado.
Uma leitura caridosa da passagem do livro seria que significa dizer que a "variável" não está disponível porque você não pode modificar seu valor persistentemente. Quaisquer atribuições de variáveis feitas em um subshell não estarão disponíveis no shell pai posteriormente, seja criando novas variáveis (como y
) ou atribuindo valores de substituição a variáveis existentes. Se o subshell atribuído a x
, o novo valor teria efeito dentro do subshell, mas a leitura dele depois daria o valor original:
$ x=world
$ echo $(x=hello ; echo $x)
hello
$ echo $x
world
Não é uma maneira muito clara de expressar isso, pelo menos na passagem que você citou. Se o livro inteiro é assim, você pode encontrar um melhor (ou ler perguntas aqui).