Tengo un script bash que es algo así como seguir,
cat filename | while read line
do
read input;
echo $input;
done
pero esto claramente no me da la salida correcta, ya que cuando leo en el ciclo while, intenta leer desde el nombre del archivo debido a la posible redirección de E / S.
¿Alguna otra forma de hacer lo mismo?
bash
while-loop
w2lame
fuente
fuente

Respuestas:
Leer desde el dispositivo terminal de control:
más información: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
fuente
bash yourscript < /foo/baresperará la entrada del usuario, esto es aceptable solo al leer contraseñas. La respuesta de @GordonDavisson es preferible para todos los demás usos.Puede redirigir el stdin regular a través de la unidad 3 para mantenerlo dentro de la tubería:
Por cierto, si realmente lo está utilizando de
catesta manera, reemplácelo con una redirección y las cosas se volverán aún más fáciles:O bien, puede intercambiar stdin y la unidad 3 en esa versión: lea el archivo con la unidad 3 y simplemente deje stdin solo:
fuente
read lineestá leyendo de notificar finalizado, pero si simplemente lo ejecuta comoread -u 3 inputestá escrito, está leyendo desde la consola)?Parece que ha leído dos veces, la lectura dentro del ciclo while no es necesaria. Además, no necesita invocar el comando cat:
fuente
readcomportamiento del interior como "incorrecto [porque] intenta leer del archivofilename") y su respuesta aceptada.Intenta cambiar el bucle así:
Prueba de unidad:
fuente
Encontré este parámetro -u con read.
"-u 1" significa "leer desde stdin"
fuente
fuente