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
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
Respuestas:
El script lee pares de cadenas de dos archivos. En cada iteración, lee una cadena desde file11
dentro lineA
y desde file22
dentro 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 <file11
medios de "conexión / redirigir la entrada estándar de file11
en este comando", donde "este comando" es el while
bucle. 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<file22
medios "conectan el descriptor de archivo 3 file22
para 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 lineA
leerá 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 read
comando 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 file22
archivo.
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:
3<file22
es como un lugar fopen
donde FID
no se devuelve sino que se especifica previamente?
fdopen()
. Si.