Capitolo 5. Redirezione dell'I/O
5.1. Semplici redirezioni
5.1.1. Cosa sono lo standard input e lo standard output?
Molti comandi Linux leggono l'input, come file o altro attributo del comando, e scrivono l'output.
Di norma l'input viene dato da tastiera e l'output appare sul vostro schermo. La tastiera costituisce il
vostro dispositivo di standard input (stdin) [ingresso standard] e lo schermo o una specifica finestra
di terminale è invece il dispositivo di standard output (stdout) [uscita standard].
Comunque, dal momento che Linux è un sistema flessibile, queste impostazioni di base non devono
essere applicate necessariamente. Ad esempio lo standard output di un server molto controllato in
un grande ambiente può essere una stampante.
5.1.2. Gli operatori di redirezione
5.1.2.1. Redirezione dell'output con > e |
Qualche volta potreste voler salvare l'output di un comando in un file oppure applicare un altro
comando sull'output di un comando. Questa operazione è nota come redirezione dell'output. La
redirezione si fa utilizzando sia “>” (simbolo di maggiore), sia l'operatore “|” (pipe in inglese) che
invia lo standard output di un comando ad un altro come standard input.
Come abbiamo visto in precedenza, il comando cat concatena i file e li invia tutti insieme allo
standard output. Redirigendo questo output ad un file, esso verrà creato – o sovrascritto se già
esistente (fate attenzione).
some words
nancy:~> cat test2 some other words
nancy:~> cat test1 test2 > test3
nancy:~> cat test3 some words
some other words
Non sovrascrivete!
State attenti a non sovrascrivere file esistenti (magari importanti) quando redirigete
l'uscita dei dati. Molte shell, compresa Bash, hanno la capacità predefinita di
proteggervi da tale rischio: noclobber (consultate le pagine Info per maggiori
informazioni). Con Bash dovreste aggiungere il comando set -o noclobber al
vostro file di configurazione .bashrc per prevenire scritture accidentali di file.
Redirigere “niente” verso un file esistente equivale a svuotarlo:
nancy:~> ls −l list
rw rw r 1 nancy nancy 117 Apr 2 18:09 list − − − −−
nancy:~> > list
nancy:~> ls −l list
rw rw r 1 nancy nancy 0 Apr 4 12:01 list − − − −−
Questo processo è chiamato troncamento.
La stessa redirezione ad un file inesistente creerà un nuovo file vuoto con il nome indicato:
nancy:~> ls −l newlist
ls: newlist: No such file or directory
nancy:~> > newlist
nancy:~> ls −l newlist
rw rw r 1 nancy nancy 0 Apr 4 12:05 newlist − − − −−
Il Capitolo 7 fornisce alcuni altri esempi dell'uso di questo tipo di redirezione.
Ecco alcuni esempi dell'utilizzo dell'incanalamento (piping) dei comandi.
Per trovare una parola in un certo testo, mostrate tutte le linee contenenti “parola1” ed escludete
quelle che contengono anche “parola2”:
grep parola1 file | grep -v parola2
Per mostrare l'output di un elenco dei file di una directory una pagina alla volta:
ls -la | less
ls -l | grep parte_del_nome_del_file
5.1.2.2. Redirezione dell'input
In altre occasioni potreste volere che un file costituisse l'input di un comando che normalmente non
accetta file come opzione. Questa redirezione dell'input si ottiene ricorrendo all'operatore “<”
(minore).
Qui sotto c'è un esempio di come inviare un file a qualcuno utilizzando la redirezione dell'input.
andy:~> mail mike@somewhere.org < to_do
Se l'utente mike esiste nel sistema, non avete bisogno di scrivere l'intero indirizzo. Se invece volete
raggiungere qualcuno su Internet, battete l'intero indirizzo come argomento di mail.
Tale esempio si legge con maggiore difficoltà rispetto al banale cat file | mail qualcuno ma è
un modo molto più elegante per usare gli strumenti disponibili.
5.1.2.3. Combinare redirezioni
L'esempio seguente combina le redirezioni di input e output. Il file testo.txt viene prima
controllato alla ricerca di errori e l'output viene poi rediretto in un file di registrazione degli errori:
spell <testo.txt> errori.log
Il comando seguente elenca tutti i comandi che potete dare per esaminare un altro file quando usate
less:
mike:~> less −−help | grep −i examine
:e [file] Examine a new file.
:n * Examine the (N th) next file from the command line.− :p * Examine the (N th) previous file from the command line.− :x * Examine the first (or N th) file from the command line.−
L'opzione -i viene utilizzata per ricerche non sensibili a maiuscolo/minuscolo (ricordate che i
sistemi UNIX sono molto “case sensitive”).
Se desiderate salvare l'output di questo comando per futura memoria, redirigetelo ad un file:
mike:~> less −−help | grep −i examine > esaminare file in less− − − mike:~> cat esaminare file in less− − −
:e [file] Examine a new file.
:n * Examine the (N th) next file from the command line.− :p * Examine the (N th) previous file from the command line.− :x * Examine the first (or N th) file from the command line.−
Di fatto l'output di un comando può essere incanalato in un altro comando quante volte volete a
condizione che normalmente tali comandi leggano i dati in ingresso dallo standard input e scrivano
nello standard output quelli in uscita. Talvolta essi non sono in grado di farlo, ma potrebbero esserci
delle speciali opzioni che istruiscono questi comandi a comportarsi secondo le regole consuete.
Leggete perciò la documentazione (pagine man e Info) dei comandi utilizzati nel caso otteniate
degli errori.
Nuovamente, siate certi di non usare nomi di file esistenti di cui avete ancora bisogno: la
redirezione dell'output a file esistenti cancellerà il loro contenuto.
5.1.2.4. L'operatore >>
Invece di sovrascrivere i dati dei file, potete anche aggiungere del testo ad un file esistente
utilizzando in successione due segni di maggiore.
Esempio:
mike:~> cat listadesideri piu' soldi
meno lavoro
mike:~> date >> listadesideri
mike:~> cat listadesideri piu' soldi
meno lavoro
Thu Feb 28 20:23:07 CET 2002