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.

Redir

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< o 1>
  • 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

Pipes

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

results matching ""

    No results matching ""