Paoletta ha scritto:già, meglio comando 2>file 1>&2 (la shell valuta da destra a sinistra)
Mi spiace contraddirti. Dal man di bash (perchè penso stiamo parlando tutti della bash):
Codice: Seleziona tutto
Redirections are processed in the order they appear, from left to right.
comunque credo ci vogliano delle delucidazioni perchè il man della bash non è molto chiaro. Cerchiamo di capire che cosa fa la shell quando duplica gli stderr e stdout.
Userò indifferentemente stderr o 2, e stdout o 1.
Prima cosa da capire è che tutti i comandi eseguiti dalla shell sono suoi figli e, pertanto ne ereditano i file descriptor aperti.
Ora, che succede quando scriviamo ad esempio:
la shell:
1) apre file (creandolo o troncandolo a zero), prendendo quindi il suo file descriptor, supponiamo 3.
2) duplica il file descriptor 1 (lo stdout) con il nuovo file descriptor. Questo provoca la chiusura dello stdout e la sua duplicazione in 3. Ovvero, scrivere in 3 o scrivere in 1 è la stessa cosa.
3) (forse, ma dovrebbe essere buona norma) chiude il file descriptor 3.
4) lancia ls.
A questo punto quando ls scrive sullo stdout (1) scrive in realtà su file. Proprio perchè lo stdout è erediato dalla shell padre.
Un altro esempio è necessario:
1) duplica lo stderr in stdout (2>&1). Questo provoca la chiusura dello stderr e la sua duplicazione nello stdout. In particolare, se lanciasse ora ls, che ls scriva in stderr o in stdout verrebbero intrambi stampati sullo stdout.
2) apre file prendondo il suo file descriptor, supponiamo ancora 3.
3) duplica il file descriptor 1 con 3 (> file). Ovvero, chiude il file descriptor 1 e lo riapre come 3.
4) lancia ls.
A questo punto succede una cosa simpatica. Se ls scrive sullo stderr, in realtà scrive sullo stdout. Se invece scrive sullo stdout, in realtà scrive sul file.
Proprio perchè la sequenza delle duplicazioni è avvenuta in questo modo: prima 2>&1 e poi 1>file.
Infine il comando:
1) apre file. File descriptor 3.
2) duplica l'1 col 3. Chiude l'1 e lo riapre come 3.
3) duplica il 2 con l'1. Chiude il 2 e lo riapre come 1, che a sua volta era il 3.
4) (forse, ma buona norma) chiude il 3)
5) lancia ls.
A questo punto, sia l'1 che il 2 riferiscono al file, e quindi sia che ls scriva su 1 che su 2, in realtà scrive sul file.
Quindi come vedi la sequenza è importante.
Spero di aver chiarito qualche dubbio a qualcuno.
Spina