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 funa sola volta, durante la execchiamata. I due echocomandi stanno solo scrivendo su un descrittore di file già aperto. Il file non fverrà quindi troncato da nessuna delle echochiamate.
Per reindirizzare l'output standard su un descrittore di file, la sintassi è >&ndove nc'è un piccolo numero intero positivo che indica il descrittore di file (non c'è >>&nreindirizzamento). 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>fquello che tronca il file ( exec 3>>fnon avrebbe troncato il file e l'avrebbe aperto in modalità append). La sola scrittura con >&3non apre il file né lo tronca.
Sarebbe stato diverso se l'avessi fatto
echo foo >f
echo bar >f
cat f
(ognuno echosi 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 execprima di ciascuno echo).