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
SIMBOLOREDIREZIONE
>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
<<Stringalegge da standard input fino a quando incontra una linea contenente solo la parola Stringa. Anche conosciuto come here document (vedere il Capitolo 9)
<<\Stringacome 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

>& fileredirige stdout(4) e stderr(4) in file
>>& fileappende stdout(4) e stderr(4) in file
|& comandocrea 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> fileredirige stderr(4) in file
> file 2>&1redirige stdout(4) e stderr(4) in file
>> file 2>&1appende stdout(4) e stderr(4) in file
2>&1 | comandocrea 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>&mredirige 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>.