J'ai le script suivant:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Ce code fonctionne bien. Mais je ne les comprends pas:
<&3
done < file11 3< file22
shell
io-redirection
read
Gaurav
la source
la source
Réponses:
Le script lit des paires de chaînes de deux fichiers. À chaque itération, il lit une chaîne de
file11
enlineA
et defile22
enlineB
. Il le fait jusqu'à ce qu'il rencontre la fin de l'un ou l'autre fichier. Le corps de la boucle produit les deux chaînes et une ligne vierge.Le
<file11
moyen "connecter / rediriger l'entrée standard defile11
dans cette commande", où "cette commande" est lawhile
boucle. Cela aurait également pu être écrit0<file11
.L'entrée standard est le descripteur de fichier numéro 0. Les descripteurs de fichier 1 et 2 sont réservés à la sortie standard et aux flux d'erreur standard.
Le
3<file22
moyen "connectez le descripteur de fichier 3 àfile22
cette commande". Le numéro 3 se trouve être le prochain numéro de descripteur de fichier "libre", mais le code aurait pu utiliser 4 ou 5 ou tout autre petit entier autre que 0, 1 et 2 à la place (la limite du nombre de descripteurs de fichier utilisables dépend du shell). utilisé, mais les nombres jusqu'à 9 sont garantis pour fonctionner).Dans la boucle,
read lineA
lira une chaîne à partir de l'entrée standard par défaut, c'est-à-dire du fichierfile11
(l'entrée standard est héritée de la boucle). Cela aurait également pu être écritread lineA <&0
.Avec
read lineB <&3
, laread
commande lit depuis le descripteur de fichier 3, c'est-à-dire depuisfile22
plutôt que depuis l'entrée standard (le descripteur de fichier 3 est disponible dans la boucle, tout comme l'entrée standard l'est).En bref, il utilise le flux d'entrée standard et un descripteur de fichier "supplémentaire" (numéro 3) pour lire à partir de deux fichiers "simultanément" (une chaîne à la fois à partir de chaque fichier à son tour). Habituellement, on n'a accès qu'à un seul flux d'entrée, mais cela contourne cette restriction en créant explicitement un deuxième flux d'entrée et en le connectant au
file22
fichier.En relation:
J'utilise le mot "chaîne" ci-dessus plutôt que "ligne". Les choses lues à partir des deux fichiers auront des espaces blancs flanquants, et certaines séquences d'échappement seront interprétées spécialement.
Pour lire une ligne à l' aide de
read
, utilisezEn relation:
la source
3<file22
c'est comme unfopen
où leFID
n'est pas retourné mais pré-spécifié?fdopen()
. Oui.