/ / bash piping impede a atribuição de variáveis ​​globais - bash, variáveis, pipe

O bash piping impede a atribuição de variáveis ​​globais - bash, variáveis, pipe

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 № 1

Todos 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?)