Quelle est la signification de "<& 3" et "done <file11 3 <file22"

16

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
Gaurav
la source
1
Pourriez-vous nous expliquer en quoi consiste le script? (Vous dites que ça marche bien)
Mathieu

Réponses:

22

Le script lit des paires de chaînes de deux fichiers. À chaque itération, il lit une chaîne de file11en lineAet de file22en lineB. 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 <file11moyen "connecter / rediriger l'entrée standard de file11dans cette commande", où "cette commande" est la whileboucle. Cela aurait également pu être écrit 0<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<file22moyen "connectez le descripteur de fichier 3 à file22cette 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 lineAlira une chaîne à partir de l'entrée standard par défaut, c'est-à-dire du fichier file11(l'entrée standard est héritée de la boucle). Cela aurait également pu être écrit read lineA <&0.

Avec read lineB <&3, la readcommande lit depuis le descripteur de fichier 3, c'est-à-dire depuis file22plutô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 file22fichier.

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, utilisez

IFS= read -r varname

En relation:

Kusalananda
la source
Bonne réponse! Ce que je ne comprends pas, c'est comment le descripteur de fichier 3 peut être utilisé. Cela signifie-t-il que 3<file22c'est comme un fopenoù le FIDn'est pas retourné mais pré-spécifié?
A. Donda
2
@ A.Donda Vous décrivez fdopen(). Oui.
Kusalananda