Entrada de lectura en bash dentro de un ciclo while

Estoy teniendo un script bash que es algo así como follow,

cat filename | while read line do read input; echo $input; done 

pero esto claramente no me está dando el resultado correcto, ya que cuando leo en el ciclo while, intenta leer el nombre del archivo debido a la posible redirección de E / S.

¿Alguna otra forma de hacer lo mismo?

Lea desde el dispositivo terminal de control:

 read input  

más información: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop

Puede redirigir el stdin normal a través de la unidad 3 para mantenerlo dentro de la canalización:

 { cat notify-finished | while read line; do read -u 3 input echo "$input" done; } 3<&0 

Por cierto, si realmente estás usando el cat esta manera, reemplázalo con una redirección y las cosas se vuelven aún más fáciles:

 while read line; do read -u 3 input echo "$input" done 3<&0  

O bien, puede intercambiar stdin y la unidad 3 en esa versión: lea el archivo con la unidad 3 y simplemente abandone el stdin en solitario:

 while read line <&3; do # read & use stdin normally inside the loop read input echo "$input" done 3 

Intenta cambiar el ciclo de esta manera:

 for line in $(cat filename); do read input echo $input; done 

Prueba de unidad:

 for line in $(cat /etc/passwd); do read input echo $input; echo "[$line]" done 

Parece que lees dos veces, la lectura dentro del ciclo while no es necesaria. Además, no necesita invocar el comando cat:

 while read input do echo $input done < filename 
 echo "Enter the Programs you want to run:" > ${PROGRAM_LIST} while read PROGRAM_ENTRY do if [ ! -s ${PROGRAM_ENTRY} ] then echo ${PROGRAM_ENTRY} >> ${PROGRAM_LIST} else break fi done