Qual è il significato di "<& 3" e "done <file11 3 <file22"


16

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

1
Potresti spiegarci cosa significa la sceneggiatura? (Dici che funziona benissimo)
Mathieu

Risposte:


22

Lo script legge coppie di stringhe da due file. In ogni iterazione, legge una stringa da file11in lineAe da file22in 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 <file11mezzo "collega / reindirizza l'input standard da file11questo comando", dove "questo comando" è il whileloop. 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<file22significato "collega il descrittore di file 3 a file22per 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 lineAleggerà 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 readcomando 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 file22file.

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:


Buona risposta! Quello che non capisco è come utilizzare il descrittore di file 3. Questo significa che 3<file22è come un fopendove FIDnon viene restituito ma pre-specificato?
A. Donda,

2
@ A.Donda Stai descrivendo fdopen(). Sì.
Kusalananda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.