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
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
file11
dentrolineA
y desdefile22
dentrolineB
. 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 defile11
en este comando", donde "este comando" es elwhile
bucle. 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<file22
medios "conectan el descriptor de archivo 3file22
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 archivofile11
(la entrada estándar se hereda del bucle). Esto también podría haber sido escritoread lineA <&0
.Con
read lineB <&3
, elread
comando 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
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
, useRelacionado:
fuente
3<file22
es como un lugarfopen
dondeFID
no se devuelve sino que se especifica previamente?fdopen()
. Si.