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