/ / ¿Cambiar una variable global dentro de una función cuando se usa "tee"? - bash, shell

¿Cambiar una variable global dentro de una función cuando se usa "tee"? - bash, shell

Me gustaría cambiar el valor de un globalvariable. Funciona perfectamente cuando ejecuto la función normalmente. Pero no es cuando lo ejecuto con un tee. Necesito el tee para tener salida tanto en la pantalla como en el archivo.

¿Por qué la Tee causa este comportamiento? ¿Hay alguna manera de modificar la variable global dentro de la función 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.

Respuestas

4 para la respuesta № 1

El problema no es con tee. Es con operación de tubería. Cada comando en una tubería se ejecuta en subcapas separadas.

Por lo tanto, los cambios realizados en las variables en las funciones no se reflejan.

Puede realizar la siguiente sustitución del proceso, pero aún así no es equivalente a la tubería.

FCT_main > >( tee file.out )

Nota: La sustitución de procesos solo funciona con algunos shells. Este código se encontró trabajando con bash shell.

Código completo

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 para la respuesta № 2

El mismo problema ocurre en el siguiente fragmento:

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

i será 0 al final del ciclo.

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

en realidad funcionará El problema es ese while se ejecuta en una subshell (y también lo es cat para el caso) cuando se usa en una tubería, pero no cuando se redirige stdin.

Si publica el código real, podríamos ayudarlo a idear una solución para su fragmento específico.