dato questo frammento:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Perché bash sta aggiungendo a f? Mi sto perdendo qualcosa?
dato questo frammento:
exec 3>f
echo foo >&3
echo bar >&3
cat f # returns foo bar
Perché bash sta aggiungendo a f? Mi sto perdendo qualcosa?
Risposte:
Quello che ti manca è che stai aprendo (e troncando) il file f
una sola volta, durante la exec
chiamata. I due echo
comandi stanno solo scrivendo su un descrittore di file già aperto. Il file non f
verrà quindi troncato da nessuna delle echo
chiamate.
Per reindirizzare l'output standard su un descrittore di file, la sintassi è >&n
dove n
c'è un piccolo numero intero positivo che indica il descrittore di file (non c'è >>&n
reindirizzamento). Il descrittore di file deve già essere associato a un file aperto affinché funzioni. È l'atto di aprire il file e associarlo a un descrittore con exec 3>f
quello che tronca il file ( exec 3>>f
non avrebbe troncato il file e l'avrebbe aperto in modalità append). La sola scrittura con >&3
non apre il file né lo tronca.
Sarebbe stato diverso se l'avessi fatto
echo foo >f
echo bar >f
cat f
(ognuno echo
si apre e si tronca f
), o, più contorto,
exec 3>f; echo foo >&3
exec 3>f; echo bar >&3
exec 3>&- # close fd 3
cat f
(il file viene aperto e troncato exec
prima di ciascuno echo
).