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/bar
esperará 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
cat
esta 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 line
está leyendo de notificar finalizado, pero si simplemente lo ejecuta comoread -u 3 input
está 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
read
comportamiento 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