/ / Cambiare una variabile globale all'interno di una funzione quando si usa “tee”? - bash, shell

Cambiare una variabile globale all'interno di una funzione quando si usa "tee"? - bash, shell

Vorrei cambiare il valore di un globalevariabile. Funziona perfettamente quando eseguo la funzione normalmente. Ma non è quando lo eseguo con una maglietta. Ho bisogno del tee per avere sia l'output sullo schermo che sul file.

Perché il T causa questo comportamento? C'è un modo per modificare la variabile globale all'interno della funzione con Tee?

FCT_main()
{
MY_VAR=2
}

MY_VAR=1

echo "MY_VAR=$MY_VAR"   # -> print 1.
FCT_main | tee file.out
echo "MY_VAR=$MY_VAR"   # -> print 1, but I expect 2 !

echo "n"

echo "MY_VAR=$MY_VAR"   # -> print 1.
FCT_main
echo "MY_VAR=$MY_VAR"   # -> print 2 as expected.

risposte:

4 per risposta № 1

Il problema non è con tee. È con il funzionamento del tubo. Ogni comando in una pipe viene eseguito in subshells separati.

Pertanto, eventuali modifiche apportate alle variabili nelle funzioni non vengono riflesse.

È possibile effettuare la seguente sostituzione del processo, ma non è ancora equivalente alle tubazioni.

FCT_main > >( tee file.out )

Nota: La sostituzione del processo funziona solo con alcune shell. Questo codice è stato trovato funzionante con la shell bash.

Codice intero

FCT_main()
{
MY_VAR=2
}

MY_VAR=1

echo "MY_VAR=$MY_VAR"   # -> print 1.
FCT_main > >( tee file.out )
echo "MY_VAR=$MY_VAR"   # -> print 1, but I expect 2 !

echo "n"

echo "MY_VAR=$MY_VAR"   # -> print 1.
FCT_main
echo "MY_VAR=$MY_VAR"   # -> print 2 as expected.

0 per risposta № 2

Lo stesso problema si verifica nel seguente frammento:

i=0
cat $file | while read line; do
i=$(($i + 1))
done

i sarà 0 alla fine del loop.

i=0
while read line; do
i=$(($i + 1))
done < $file

funzionerà davvero. Il problema è che while viene eseguito in una subshell (e così è cat del resto) quando usato in una tubazione, ma non nel reindirizzamento di stdin.

Se pubblichi il codice effettivo, potremmo essere in grado di aiutarti a escogitare una soluzione per lo snippet specifico.