Pourquoi ne peut-il être utilisé qu'une seule fois lorsque nous ouvrons nous-mêmes le descripteur de fichier et que nous le redirigeons vers stdin ?
Veuillez consulter l'exemple ci-dessous pour comprendre ce que je veux dire. Après l'avoir lu une fois avec la commande cat, le fichier n'est pas lu une deuxième fois via le même descripteur de fichier.
└─$ exec 6< input.txt
└─$ cat <&6
i am just string
and another string..
└─$ cat <&6
└─$
Réponse acceptée :
Pour imprimer le fichier, le premier cat
il faut le lire jusqu'au bout. exec 6< input.txt
oblige le shell à conserver le descripteur de fichier jusqu'à ce que le
shell meure ou le ferme, de sorte que le décalage du fichier pointe toujours vers la fin du
fichier lorsque le second cat
est invoqué, qui n'écrit donc rien sur stdout.
Si vous êtes sur un système basé sur Linux, vous pouvez voir ce qui se passe en consultant les informations du descripteur de fichier :
echo "File contents" > input.txt
exec 6< input.txt
cat "/proc/$$/fdinfo/6"
cat <&6
cat "/proc/$$/fdinfo/6"
cat <&6
Si vous exécutez ce script, vous obtiendrez quelque chose comme
pos: 0
flags: 0100000
mnt_id: 113
File contents
pos: 14
flags: 0100000
mnt_id: 113
confirmant que le décalage (pos
) n'est pas 0
lorsque le deuxième cat
est exécuté, mais pointe vers sa fin.
Pour réinitialiser le décalage, vous pouvez ajouter un autre exec 6< input.txt
entre le cat
s.