Reescribir el ciclo de esta manera revela lo que está sucediendo:
echo '1 2 3 4 5 6' | while read a b c
do
echo '(iteration beginning)' a="$a" b="$b" c="$c" '(iteration ending)'
done
Esto da, como su salida:
(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)
Observe primero que solo se ejecuta un comando echo. Si se ejecutara más de una vez, vería, entre otras cosas, las subcadenas (iteration beginning)e (iteration ending)impresas más de una vez.
Esto quiere decir que tener un whilebucle aquí no es realmente lograr nada. El readarchivo incorporado lee el texto separado por espacios en blanco 1 en cada variable especificada. La entrada adicional se agrega al final de la última variable especificada. 2 Así, las variables ay btoman los valores 1y 2respectivamente, mientras que ctoman el valor 3 4 5 6.
Cuando la condición del bucle ( while read a b c) se evalúa por segunda vez, no hay más entradas disponibles desde la tubería (solo lo canalizamos una sola línea de texto), por lo que el readcomando se evalúa como falso en lugar de verdadero y el bucle se detiene (antes de ejecutar el cuerpo por segunda vez).
1 : Para ser técnico y específico, el readincorporado , cuando pasa los nombres de las variables como argumentos, lee la entrada, dividiéndola en "palabras" separadas cuando encuentra espacios en blanco IFS (vea también esta pregunta y este artículo ).
2 : readel comportamiento de bloquear cualquier campo adicional de entrada en la última variable especificada no es intuitivo para muchos scripters, al principio. Se vuelve más fácil de entender cuando se considera que, como dice la respuesta de Florian Diesch , readsiempre (intentará) leer una línea completa, y que readestá destinada a ser utilizable con y sin bucle.