étant donné cet extrait:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Pourquoi bash s'ajoute-t-il à f? Suis-je en train de manquer quelque chose?
la source
étant donné cet extrait:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Pourquoi bash s'ajoute-t-il à f? Suis-je en train de manquer quelque chose?
Ce qui vous manque, c'est que vous n'ouvrez (et ne tronquez) le fichier f
qu'une seule fois, lors de l' exec
appel. Les deux echo
commandes écrivent simplement dans un descripteur de fichier déjà ouvert. Le fichier f
ne sera donc pas tronqué par aucun des echo
appels.
Pour rediriger la sortie standard vers un descripteur de fichier, la syntaxe est >&n
où se n
trouve un petit entier positif désignant le descripteur de fichier (il n'y a pas de >>&n
redirection). Le descripteur de fichier doit déjà être associé à un fichier ouvert pour que cela fonctionne. C'est l'acte d'ouvrir le fichier et de l'associer à un descripteur exec 3>f
qui tronque le fichier ( exec 3>>f
n'aurait pas tronqué le fichier et l'aurait ouvert en mode ajout). Le simple fait d'écrire avec >&3
n'ouvre pas le fichier et ne le tronque pas.
Ça aurait été différent si tu l'avais fait
echo foo >f
echo bar >f
cat f
(chacun echo
s'ouvre et tronque f
), ou, plus alambiqué,
exec 3>f; echo foo >&3
exec 3>f; echo bar >&3
exec 3>&- # close fd 3
cat f
(le fichier est ouvert et tronqué par exec
avant chacun echo
).