Pourquoi la redirection bash vers un fichier se produit en mode ajout

8

é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?

user374819
la source

Réponses:

19

Ce qui vous manque, c'est que vous n'ouvrez (et ne tronquez) le fichier fqu'une seule fois, lors de l' execappel. Les deux echocommandes écrivent simplement dans un descripteur de fichier déjà ouvert. Le fichier fne sera donc pas tronqué par aucun des echoappels.

Pour rediriger la sortie standard vers un descripteur de fichier, la syntaxe est >&noù se ntrouve un petit entier positif désignant le descripteur de fichier (il n'y a pas de >>&nredirection). 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>fqui tronque le fichier ( exec 3>>fn'aurait pas tronqué le fichier et l'aurait ouvert en mode ajout). Le simple fait d'écrire avec >&3n'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 echos'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 execavant chacun echo).

Kusalananda
la source