Devido a uma necessidade específica, preciso que todas as saídas stdout de uma função bash sejam armazenadas em uma variável ("F_MY_FUNC_R"), mas também preciso dessa função para modificar o valor de determinadas variáveis ("VAL_A" e "VAL_B") de acordo para codificar abaixo.
PERGUNTA: Por que as variáveis VAL_A e VAL_B não estão sendo modificadas? Existe uma maneira de contornar isso?
CÓDIGO
VAL_A="none"
VAL_B="none"
f_my_func() {
echo "some info some info some info some info some info "
echo "some info some info some info some info some info "
echo "some info some info some info some info some info "
echo "some info some info some info some info some info "
VAL_A="some value"
VAL_B="some value"
}
F_MY_FUNC_R=$(f_my_func)
echo "$F_MY_FUNC_R"
echo "$VAL_A"
echo "$VAL_B"
RESULTADO
[root@localhost some_folder]# echo "$F_MY_FUNC_R"
some info some info some info some info some info
some info some info some info some info some info
some info some info some info some info some info
some info some info some info some info some info
[root@localhost some_folder]# echo "$VAL_A"
none
[root@localhost some_folder]# echo "$VAL_B"
none
Obrigado! =D
É uma regra fundamental no shell que um subshell não pode modificar suas variáveis pai nem ambiente. A execução da função dentro de um
$(f_my_func)
subshell é afetada por essa regra e as variáveis pai VAL_A e VAL_B não são alteradas.Se você precisar alterar as variáveis pai em uma função, não capture a saída da função, torne a saída alguma outra variável:
Aqui está a minha solução "suja"... =D
NOTA: Como eu disse minha função real é enorme, então gostaria de manter as saídas desta função (
echo
basicamente) em um arquivo de log que é gerado com a entrada emF_MY_FUNC_OP
. Fora isso, meu esquema de log usaF_MY_FUNC_OP
e é composto de muitos componentes legados.Desta forma posso executar a função e redirecionar seu stderr e stdout para um arquivo ao mesmo tempo que permito a manipulação de variáveis externas à função (caso de "$VAL_A" e "$VAL_B"), caso contrário ("F_MY_FUNC_OP= $(f_my_func)" ou "F_MY_FUNC_OP=`f_my_func`", por exemplo) a função será executada em um "subshell" e a manipulação dessas variáveis não será possível.
Obrigado a @jesse_b, @AdminBee e @Isaac! =D