miércoles, 22 de marzo de 2017

No puedes canalizar a read

Aunque el comando read normalmente toma la entrada de la entrada estándar, no puedes hacer esto:

echo "foo" | read

Esperaríamos que esto funcionase, pero no lo hace. El comando parecerá funcionar pero la variable REPLY siempre estará vacía ¿Y esto por qué?

La explicación tiene que ver con la forma en que el shell maneja las tuberías o pipes. En bash (y otros shells como sh), las tuberías crean subshells. Estos son copias del shell y su entorno que se usan para ejecutar el comando en la tubería. En nuestro ejemplo anterior, read se ejecuta en un subshell.

Los subshells en sistemas tipo Unix crean copias del entorno para que los procesos lo usen mientras se ejecuten. Cuando los procesos terminan, la copia del entorno es destruida. Esto significa que un subshell nunca puede alterar el entorno de su proceso padre. read asigna variables, que luego pasan a ser parte del entorno. En el ejemplo anterior, read asigna el valor "foo" a la variable REPLY en el entorno de su subshell, pero cuando el comando finaliza, el subshell y su entorno son destruidos, y el efecto de la asignación se pierde.

Usar cadenas-aquí es una forma de evitar este comportamiento. Veremos otro método en el Capítulo 36.

No hay comentarios:

Publicar un comentario