unset v
function f {
v=1
}
f | cat
echo v=$v
f
echo v=$v
Por que a tubulação (para qualquer comando) impede que o primeiro comando de eco imprima 1? O segundo eco imprime 1. Estou usando um shell bash. Posso ver isso copiando / colando ou executando isso como um script.
Respostas:
9 para resposta № 1Todos os componentes de um pipeline (se houver mais de um) são executados em um subshell, e suas atribuições de variáveis não persistem no shell principal.
A razão para isso é que o bash não suporta multithreading real (com acesso simultâneo a variáveis), apenas subprocessos que são executados em paralelo.
Como evitar isso:
Você tem que fazer todas as atribuições de variáveis que deseja manter no a Principal processo bash (ou encontre alguma maneira de transferi-los para lá). A maneira bash de fazer isso seria não usar um pipe, mas usar substituição de processo:
f > >( cat )
Claro, isso não vai ajudar se você precisa fazeratribuições de variáveis em ambos os processos de um pipe. Então, você precisa pensar em um mecanismo melhor (talvez coprocessos e gerar as variáveis em algum lugar?)