Ho il seguente script:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Questo codice funziona bene. Ma non capisco questi:
<&3
done < file11 3< file22
Ho il seguente script:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Questo codice funziona bene. Ma non capisco questi:
<&3
done < file11 3< file22
Risposte:
Lo script legge coppie di stringhe da due file. In ogni iterazione, legge una stringa da file11
in lineA
e da file22
in lineB
. Lo fa fino a quando non incontra la fine di entrambi i file. Il corpo del loop emette le due stringhe e una riga vuota.
Il <file11
mezzo "collega / reindirizza l'input standard da file11
questo comando", dove "questo comando" è il while
loop. Anche questo avrebbe potuto essere scritto 0<file11
.
L'input standard è il descrittore di file numero 0. I descrittori di file 1 e 2 sono riservati per l'output standard e i flussi di errori standard.
Il 3<file22
significato "collega il descrittore di file 3 a file22
per questo comando". Il numero 3 sembra essere il prossimo numero descrittore di file "libero", ma il codice avrebbe potuto usare 4 o 5 o qualsiasi numero intero piccolo diverso da 0, 1 e 2 (il limite dei numeri descrittori di file utilizzabili dipende da quale shell è in uso, ma i numeri fino a 9 sono garantiti per funzionare).
Nel loop, read lineA
leggerà una stringa dall'input standard per impostazione predefinita, ovvero dal file file11
(l'input standard viene ereditato dal loop). Anche questo avrebbe potuto essere scritto read lineA <&0
.
Con read lineB <&3
, il read
comando legge dal descrittore di file 3, ovvero da file22
, anziché dall'input standard (il descrittore di file 3 è disponibile nel loop, proprio come lo è l'input standard).
In breve, utilizza il flusso di input standard e un descrittore di file "extra" (numero 3) per leggere da due file "contemporaneamente" (una stringa alla volta da ciascun file a sua volta). Di solito, si ha accesso a un solo flusso di input, ma ciò elude tale limitazione creando esplicitamente un secondo flusso di input e collegandolo al file22
file.
Relazionato:
Uso la parola "stringa" sopra anziché "linea". Le cose lette dai due file saranno spogliate di spazi bianchi a fianco e alcune sequenze di escape saranno interpretate in modo speciale.
Per leggere una riga utilizzando read
, utilizzare
IFS= read -r varname
Relazionato:
3<file22
è come un fopen
dove FID
non viene restituito ma pre-specificato?
fdopen()
. Sì.