É simples, porque o subshell é avaliado a partir do seu shell atual e não do seu subshell. Escapar do $()
fará com que funcione como esperado:
/bin/bash -c "\
A=/tmp/foo; \
echo \$( touch \$A; ); \
echo \$( echo in subshell, \$A; ); \
"
Como resolvo uma variável em um subshell dentro de "bash -c"?
A seguir, a segunda subshell - aquela com um "eco" dentro - é resolvida corretamente. A primeira subshell - com "touch" - não.
/bin/bash -c "\
A=/tmp/foo; \
echo $( touch \$A; ); \
echo $( echo in subshell, \$A; ); \
"
Como você está usando aspas duplas, o Bash está avaliando a string inteira primeiro, depois a executa.
Substitua sua primeira linha por /bin/bash -c echo “\
e você verá o seguinte: o código bash -c
está tentando executar.
/bin/bash -c echo "\
…
touch \$A; ); echo $( echo in subshell, \$A; ); "
echo in subshell, \$A; ); "
touch \$A; ); echo $( echo in subshell, \$A; );
touch \$A;
echo in subshell, \$A; );
echo in subshell, \$A;
Use aspas simples em vez disso.
Tags bash