Não, o subshell foi criado primeiro.
Um ambiente de execução de shell contém parâmetros de shell definidos por atribuições de variáveis e variáveis de ambiente. Um ambiente subshell foi criado duplicando o ambiente shell, portanto, ele contém todas as variáveis do ambiente shell atual.
Veja o exemplo:
$ b=1
$ c=$(b=2; echo "$b")
$ echo "$c"
2
A saída é 2
em vez de 1
.
Um ambiente subshell criado por substituição de comando é diferente com um ambiente de shell criado chamando o executável do shell.
Quando você chama o shell como:
$ bash -c :
o shell atual usou execve () para criar um novo processo shell, algo como:
execve("/bin/bash", ["bash", "-c", ":"], [/* 64 vars */]) = 0
o último argumento passado para execve
contém todas as variáveis de ambiente.
É por isso que você precisa exportar as variáveis para empurrá-lo para as variáveis de ambiente , que será incluído nos comandos executados posteriormente:
$ a=; export a
$ strace -e execve bash -c :
execve("/bin/bash", ["bash", "-c", ":"], [/* 65 vars */]) = 0
+++ exited with 0 +++
Observe que as variáveis de ambiente mudam de 64 para 65. E as variáveis que não são exportadas não serão passadas para o novo ambiente de shell:
$ a=; b=; export a
$ strace -e execve bash -c :
execve("/bin/bash", ["bash", "-c", ":"], [/* 65 vars */]) = 0
+++ exited with 0 +++
Observe que as variáveis de ambiente ainda são 65.
Na substituição do comando, o shell usou fork () para criar um novo processo shell, que apenas copiou o ambiente atual do shell - que contém variáveis configuradas e variáveis de ambiente.