/ / piping bash impedisce l'assegnazione di variabili globali - bash, variabili, pipe

bash piping previene l'assegnazione di variabili globali - bash, variabili, pipe

unset v
function f {
v=1
}
f | cat
echo v=$v
f
echo v=$v

Perché il piping (con qualsiasi comando) impedisce al primo comando echo di stampare 1? Il secondo eco stampa 1. Sto usando una shell bash. Posso vederlo con copia / incolla o eseguendo questo come script.

risposte:

9 per risposta № 1

Tutti i componenti di una pipeline (se più di uno) vengono eseguiti in una subshell e le loro assegnazioni di variabili non persistono nella shell principale.

La ragione di ciò è che bash non supporta il reale multithreading (con accesso simultaneo alle variabili), solo processi secondari eseguiti in parallelo.


Come evitare questo:

Devi fare assegnazioni di variabili che vuoi conservare nel principale processo bash (o trovare un modo per trasferirli lì). Il modo più semplice per farlo sarebbe non usare una pipe, ma usare invece la sostituzione del processo:

f > >( cat )

Certo, questo non aiuta se devi farloassegnazioni variabili in entrambi i processi di un tubo. Quindi devi pensare ad un meccanismo migliore (magari coprocesses, ed emettere le variabili da qualche parte?)