Redirezioni e Pipes
Redirezioni
Ogni processo (programma o procedura in esecuzione)
ha associati d'ufficio tre file:
- stdin o standard input - di default da tastiera
- stdout o standard output (ovvero output normale) - di default al video
- stderr o standard error (ovvero output per gli errori) - di default al video
Ogni processo ha una file table o tabella dei file aperti dal processo, con ogni record indicizzato da un numero interoche parte da zero, il file descriptor (fd).
I primi tre fd, 0 1 2
, corrispondono rispettivamente a stdin stdout stderr
.
Ridirigere significa associare uno dei tre file standard ad un altro file su disco, anzichè a tastiera e video.
Formalmente si compie indicando il file descriptor che viene ridiretto, subito seguito dai simboli <
o >
per indicare la ridirezione della lettura o della scrittura, rispettivamente.
Vi sono due semplificazioni:
0<
(redirezione dello standard input) si può scrivere semplicemente<
1>
(redirezione dello standard output) si può scrivere semplicemente>
Ma la redirezione dello standard error continua ad essere 2>
.
E' da notare che i simboli di 'redirezione' sono simili a quelli di Windows ma vi sono alcune differenze:
- in Windows non si scrive
0<
o1>
- in Windows lo standard error non esiste
Attenzione: La redirezione dello standard output su un file già esistente, se abbiamo il permesso di scrittura, sovrascrive il file. Non viene dato nessun warning.
La particolare redirezione >>
scrive lo standard output in modalità append cioè alla fine di un file già esistente. se il file non esiste viene creato.
Esempi di Redirezioni
Il comando ls -l /etc > lista
ridirige l'output nel file lista.
Il comando echo "2+2" 1> conto
ridirige (formalmente) la stringa "2+2" nel file conto.
Il comando bc < conto
lancia l'utility bc
(calcolatrice) che legge l'input dal file conto e produce il risultato (4) su output.
Il comando ls /etc/passwd xyyxz
produce:
/etc/passwd
su standard output perchè il file esiste- un errore su standard error perchè il file
xyyxz
non esiste
Il comando ls /etc/passwd xyyxz > /dev/null
:
- butta via lo standard output. Il device
/dev/null
è il cestino infinito - mostra comunque l'errore perchè non abbiamo ridiretto lo standard error
Il comando ls /etc/passwd xyyxz 2> /dev/null
butta via lo standard error e tirne lo standard output.
Il comando ls /etc/passwd xyxxz > /dev/null 2>&1
butta via entrambi.
Merge
Quando si vuole ridirigere sia lo standard output che lo standard error nello stesso file, non si deve scrivere:
comando > file 2> file
perchè file
viene aperto due volte e i due flussi interferiscono (l'uno cancella quello che l'altro ha già scritto).
Bisogna invece scrivere:
comando > file 2>&1
Si legge 2>&1
: il file descriptor 2 è ridiretto in merge al file descriptor 1.
In questo modo il file
è aperto una sola volta (da standard output e il flusso di standard error è intercalato allo standard error.
Il comando cat
cat
- Scrive lo standard input su standard output
- Ammette redirezioni
cat file1 file2 ...
- Concatena (catenates) i file sullo standard output
cat mail??.elm > archivio
- Compie un 'join' di tutti i file nell'archivio
cat mail99.elm >> archivio
- Scrive il file in append
cat > log.txt
- Scrive al file quello che si digita da tastiera
- Terminare con
Ctrl-D
(fine file di input) - attenzione a non digitare il Ctrl-D troppe volte o si rischia di chiudere la shell interattiva corrente
Il comando echo
echo ”Ciao a tutta l'Europa”
Invia i suoi argomenti a standard output, seguiti da un newline
- Se gli argomenti contengono metacaratteri, nasconderli tra apici
echo -n ”Scelta: ”
non invia il newline (Linux)
echo ”Scelta: \c”
non invia il newline (System V).
echo -e ”\tScelta: \c”
inserisce un tab e non invia il newline (Linux)
echo ”Buongiorno” >> saluti
compie una redirezione in append al file
Il comando echo
di default invia il suo argomento a standard output.
Se desideriamo stampare un errore, che quindi logicamente dovrebbe andare a standard error, allora scriviamo:
echo "errore" 1>&2
Pipes
Una pipe, rappresentata dal simbolo |
(alto a sinistra sulla tastiera) è una giunzione tra due comandi:
- ridirige lo standard output del comando prima nello standard input del comando dopo
- i due comandi si chiamano il produttore e il consumatore dei dati
- sincronizza il produttore e il consumatore in modo che non scrivano e leggano simultaneamente, ma alternandosi
- è una primitiva di Inter-Process Communication (IPC) del kernel
Si possono avere più pipes concatenate (max 10 processi) a formare una pipeline.
Se uno solo dei processi di una pipeline fallisce, anche tutti gli altri processi vengono terminati (situazione detta broken pipe).
(In bash) Non si possono fare pipes dello standard error o input.
Esempi di Pipes
who | wc -l
Ritorna quanti sono gli utenti collegati al sistema
wc -l | -w | -c [file]
conta le linee, le parole, i caratteri in un file o nello standard input
cat /etc/passwd | sort
Elenca gli account di sistema in ordine alfabetico
Si chiamano filtri i comandi che ammettono un argomento opzionale, il file su cui operano, ma
se l'argomento manca, operano su standard input
I filtri possono seguire una pipe
Ogni comando filtro deve produrre output “pulito” poichè potrebbe essere processato da una pipe seguente