Em:
$(echo "
export TEST_A=1
export TEST_B=2
")
sendo $(...) , apenas uma expansão é analisada como um comando simples.
Para que a expansão $(...) seja submetida ao operador split + glob. A saída de echo é aparada de seus caracteres de nova linha à direita e dividida em várias palavras em caracteres IFS (nova linha, espaço e tabulação por padrão):
-
export -
TEST_A=1 -
export -
TEST_B=2
E cada palavra sofre globbing. Aqui eles se expandem para si mesmos, pois não contêm caracteres curinga. Então, depois de globbing, ainda temos a mesma lista de quatro strings.
O comando a ser executado é derivado do primeiro. Aqui export e todas essas cadeias são passadas como argumentos para esse comando. Então, aqui, é como se você tivesse escrito:
export TEST_A=1 export TEST_B=2
Portanto, você está exportando a variável TEST_A com o valor 1, a variável export sem alterar seu valor e a variável TEST_B com valor 2.
No último, você está executando:
unset TEST_A export TEST_B=1
Se você quiser que a saída de echo seja tratada como código de shell para interpretar, é aí que você deseja usar eval e não usar o split + glob operador (cite sua substituição de comando):
eval "$(echo "
unset TEST_A
export TEST_B=1
")"
Esse também é um comando simples . Duas strings: eval e <newline><spaces>unset TEST_A<newline><spaces>export TEST_B=1 .
eval avalia o conteúdo de seus argumentos como código shell. Portanto, ele executa essas duas linhas de comando do shell: unset TEST_A e export TEST_B=1 (novamente, dois comandos simples ).