6.2 Redirezione di file

La redirezione dell'output prende l'output di un comando e lo posiziona nel file specificato. La redirezione dell'input legge il file specificato come input per un comando. La tabella che segue sintetizza le possibili modalità di redirezione.

Tabella 6-1. Redirezione di file

SIMBOLO REDIREZIONE
> redirezione dell'output
>! come sopra, ma non tiene conto dell'opzione noclobber per csh(1)
>> appende l'output
>>! come sopra, ma non tiene conto dell'opzione noclobber su csh(1) e crea il file se non esiste
| incanala (pipe) l'output nell'input di un altro comando
< redirezione dell'input
<<Stringa legge da standard input fino a quando incontra una linea contenente solo la parola Stringa. Anche conosciuto come here document (vedere il Capitolo 9)
<<\Stringa come sopra, ma le sostituzioni di shell non sono permesse

Un esempio di redirezione dell'output è:

cat file1 file2 > file3

Il precedente comando concatena file1 e file2 e redirige (manda) l'output in file3. Se file3 non esiste, viene creato. Se esiste, verrà troncato a lunghezza zero prima che il nuovo contenuto sia inserito, oppure, se l'opzione noclobber della shell csh(1) è abilitata, il comando verrà rifiutato (vedere la shell csh(1) nel Capitolo 5). I file originali file1 e file2 rimarranno come erano prima dell'esecuzione del comando, ossia due entità separate.

L'output viene appeso a un file con la forma:

cat file1 >> file2

Questo comando appende il contenuto di file1 alla fine dell'esistente file2 (file2 non viene soprascritto).

L'input è rediretto (preso) da un file con la forma:

programma < file

Questo comando prende l'input per il programma da file.

Per incanalare (pipe) l'output di un programma nell'input di un altro programma si usa la forma:

comando|comando

Questo comando assegna l'output del primo comando all'input del secondo comando.

6.2.1 Csh

>& file redirige stdout(4) e stderr(4) in file
>>& file appende stdout(4) e stderr(4) in file
|& comando crea una pipe tra stdout(4)-stderr(4) e il comando

Per redirigere stdout(4) e stderr(4) in due file separati si deve prima redirigere stdout(4) in una sotto-shell, così:

% (comando > out_file) >& err_file

6.2.2 Sh

2> file redirige stderr(4) in file
> file 2>&1 redirige stdout(4) e stderr(4) in file
>> file 2>&1 appende stdout(4) e stderr(4) in file
2>&1 | comando crea una pipe tra stdout(4)-stderr(4) e il comando

Per redirigere stdout(4) e stderr(4) in due file separati si può fare:

$ comando 1> out_file 2> err_file

oppure, data la redirezione di default per stdout(4):

$ comando > out_file 2> err_file

Con la shell Bourne si possono specificare altri descrittori di file (da 3 a 9) e redirigere l'output attraverso questi. Questo può essere fatto con la forma:

n>&m redirige il descrittore di file n sul descrittore di file m

Questo meccanismo viene utilizzato per mandare stderr(4) nello stesso posto di stdout(4), 2>&1, quando si vuole avere i messaggi di errore e i normali messaggi in un file piuttosto che sul terminale. Se si vuole che solamente i messaggi di errore vadano nel file, si può usare un descrittore di file di supporto, 3. Si redirige prima 3 su 2, quindi 2 su 1 e in fine si redirige 1 su 3.

$ (comando 3>&2 2>&1 1>&3) > file

Questo manda stderr(4) in 1 e stdout(4) in 3 che è rediretto su 2. In questo modo, in effetti, si ribaltano i normali significati dei descrittori di file 1 e 2. Si può sperimentare tutto questo con l'esempio seguente:

$ (cat file 3>&2 2>&1 1>&3) > errfile

Quindi se file è letto, l'informazione è scartata dall'output del comando, ma se file non può essere letto, i messaggi di errore sono messi nel file errfile per usi futuri.

I descrittori di file che sono stati creati possono essere chiusi con:

m<&- chiude un descrittore di file di input
<&- chiude stdin(4)
m>&- chiude un descrittore di file di output
>&- chiude stdout(4)

Questo, ed altri documenti, possono essere scaricati da ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Per domande su FreeBSD, leggi la documentazione prima di contattare <questions@FreeBSD.org>.
Per domande su questa documentazione, invia una e-mail a <doc@FreeBSD.org>.