Tengo el siguiente script:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Este código está funcionando bien. Pero no entiendo estos:
<&3done < file11 3< file22
shell
io-redirection
read
Gaurav
fuente
fuente

Respuestas:
El script lee pares de cadenas de dos archivos. En cada iteración, lee una cadena desde
file11dentrolineAy desdefile22dentrolineB. Lo hace hasta que encuentra el final de cualquiera de los archivos. El cuerpo del bucle genera las dos cadenas y una línea en blanco.Los
<file11medios de "conexión / redirigir la entrada estándar defile11en este comando", donde "este comando" es elwhilebucle. Esto también podría haber sido escrito0<file11.La entrada estándar es el descriptor de archivo número 0. Los descriptores de archivo 1 y 2 están reservados para la salida estándar y las secuencias de error estándar.
Los
3<file22medios "conectan el descriptor de archivo 3file22para este comando". El número 3 es el siguiente número de descriptor de archivo "libre", pero el código podría haber usado 4 o 5 o cualquier número entero pequeño que no sea 0, 1 y 2 (el límite de los números de descriptor de archivo utilizables depende de qué shell es se usa, pero se garantiza que funcionen los números hasta el 9).En el bucle,
read lineAleerá una cadena de entrada estándar de forma predeterminada, es decir, del archivofile11(la entrada estándar se hereda del bucle). Esto también podría haber sido escritoread lineA <&0.Con
read lineB <&3, elreadcomando lee desde el descriptor de archivo 3, es decir, desdefile22, en lugar de desde la entrada estándar (el descriptor de archivo 3 está disponible en el bucle, al igual que la entrada estándar).En resumen, utiliza la secuencia de entrada estándar y un descriptor de archivo "extra" (número 3) para leer dos archivos "simultáneamente" (una secuencia a la vez de cada archivo). Por lo general, uno solo tiene acceso a una secuencia de entrada, pero esto evita esa restricción al crear explícitamente una segunda secuencia de entrada y conectarla al
file22archivo.Relacionado:
Yo uso la palabra "cadena" arriba en lugar de "línea". Las cosas leídas de los dos archivos tendrán espacios en blanco flanqueados, y ciertas secuencias de escape se interpretarán especialmente.
Para leer una línea usando
read, useRelacionado:
fuente
3<file22es como un lugarfopendondeFIDno se devuelve sino que se especifica previamente?fdopen(). Si.