2011-07-30 11 views
68

Estoy teniendo un script bash que es algo así como después,Leer la entrada en bash dentro de un bucle while

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

pero esto está claro que no me está dando la salida derecha como cuando leo en el bucle mientras se intenta leer el nombre del archivo debido a la posible redirección de E/S.

¿Alguna otra forma de hacer lo mismo?

+0

Lo mismo sucede cuando se cambia de usuario en bash y el comando de lectura bajo el usuario de conmutación en escritura – krupal

Respuesta

6

tratar de cambiar el bucle de la siguiente manera: prueba

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

Unidad:

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

@ w2lame prueba una vez más, cambiar "while" loop a "for" loop - trabajando para mí. Intenta "sex -x" ver dónde viene el error de – dimba

+3

do not use cat, ver respuesta de Hai Vu –

+0

+1. Esto fue mucho más fácil de implementar para mis necesidades específicas que otras sugerencias. –

5

Parece que leer dos veces, la lectura dentro del bucle while no es necesario. Además, no es necesario invocar el comando cat:

while read input 
do 
    echo $input 
done < filename 
+0

El objetivo del OP es que el usuario lea la información dentro del ciclo, mientras que el el exterior es para leer del archivo. Por lo tanto, legítimamente quieren dos lecturas diferentes, de dos fuentes diferentes. Esto es claro tanto en el texto de la pregunta (describiendo el comportamiento interno de 'lectura 'como" no correcto [porque] trata de leer desde el archivo' nombre de archivo' ") y su respuesta aceptada. –

44

puede redirigir la entrada estándar regular a través de la unidad 3 para mantener el conseguirlo dentro de la tubería:

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

Por cierto, si realmente están utilizando cat esta manera, sustituirla por una redirección y las cosas se vuelven aún más fácil:

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

+1 para stdin vía/dev/fd/3 – philcolbourn

+0

¿por qué está colgando su segundo script? –

+2

@LucaBorrione: ¿Cómo lo usas? ¿Está esperando que lo ingrese (tenga en cuenta que 'read line' está leyendo from notify-finished, pero si solo lo ejecuta como está escrito' read -u 3 input' está leyendo desde la consola)? –

-5
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 
Cuestiones relacionadas