Isso porque a substituição do comando, $()
, gera uma sub-rede e o comando dentro é executado nessa sub-camada.
Assim, quaisquer modificações feitas em qualquer estrutura de dados não seriam propagadas para o shell pai. Em outras palavras, as alterações estão sendo feitas corretamente, mas em um subshell, portanto, os parâmetros relevantes do shell pai não estão sendo afetados.
Como uma nota lateral, quando você executa um script, ele é executado em um subshell; Um truque comum para tornar todas as alterações dos parâmetros disponíveis no shell de chamada é source
( .
) do script.
Exemplo:
$ foo() { bar=2 ;}
$ bar=1
$ $(foo)
$ echo "$bar"
1
$ foo
$ echo "$bar"
2