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
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
Réponses:
Le script lit des paires de chaînes de deux fichiers. À chaque itération, il lit une chaîne de file11
en lineA
et de file22
en 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 <file11
moyen "connecter / rediriger l'entrée standard de file11
dans cette commande", où "cette commande" est la while
boucle. 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<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 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 read
commande lit depuis le descripteur de fichier 3, c'est-à-dire depuis file22
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
, utilisez
IFS= read -r varname
En relation:
3<file22
c'est comme un fopen
où le FID
n'est pas retourné mais pré-spécifié?
fdopen()
. Oui.