¿Cuál es el significado de "<& 3" y "done <file11 3 <file22"

16

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:

  • <&3
  • done < file11 3< file22
Gaurav
fuente
1
¿Podrías explicarnos qué hace el guión? (Dices que está funcionando bien)
Mathieu

Respuestas:

22

El script lee pares de cadenas de dos archivos. En cada iteración, lee una cadena desde file11dentro lineAy desde file22dentro lineB. 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 de file11en este comando", donde "este comando" es el whilebucle. Esto también podría haber sido escrito 0<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 3 file22para 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 archivo file11(la entrada estándar se hereda del bucle). Esto también podría haber sido escrito read lineA <&0.

Con read lineB <&3, el readcomando lee desde el descriptor de archivo 3, es decir, desde file22, 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, use

IFS= read -r varname

Relacionado:

Kusalananda
fuente
¡Buena respuesta! Lo que no entiendo es cómo se puede usar el descriptor de archivo 3. ¿Esto significa que 3<file22es como un lugar fopendonde FIDno se devuelve sino que se especifica previamente?
A. Donda
2
@ A.Donda Estás describiendo fdopen(). Si.
Kusalananda