next up previous contents index
Next: Multitasking Up: Lavorare con Unix Previous: Risparmiare tempo con bash

Standard Input e Standard Output

Proviamo a risolvere un problema semplice: ottenere un listato della directory /usr/bin. Se facciamo ls /usr/bin, alcuni file scrolleranno fuori dallo schermo. Come possiamo vederli tutti?

Concetti di Unix

Il sistema operativo Unix rende molto semplice per i programmi usare il terminale. Quando un programma scrive qualcosa sullo schermo, sta usando una cosa che si chiama standard output . Lo standard output, abbreviato in stdout, è quello che usano i programmi per scrivere le informazioni all'utente. Il nome per quello che usate voi per comunicare con i programmi è standard input  (stdin). È possibile che i programmi comunichino con l'utente senza usare standard input o output, ma la maggior parte dei comandi che descrivo in questo libro usano stdin e stdout.

Per esempio, il comando ls stampa il listato di una directory sullo standard output, che è normalmente ``connesso'' al vostro terminale. Un comando interattivo, come la shell, bash, legge i vostri comandi dallo standard input.

È anche possibile per un programma scrivere nello standard error , dato che è molto semplice dirottare lo standard output altrove rispetto al terminale. Lo standard error, stderr, è quasi sempre connesso al terminale, così una persona può leggere i messaggi d'errore.

In questa sezione esamineremo tre modi per divertirsi con lo standard input e output: redirezione dell'input, dell'output e pipe.

Redirezione dell'output

 

Una caratteristica importante di Unix è la capacità di redirigere l'output. Questo vi permette, invece di vedere i risultati di un comando, di registrarli in un file o di mandarli direttamente alla stampante. Per esempio, per redirigere l'output del comando ls /usr/bin, metteremo un segno > alla fine della linea e diremo in quale file vogliamo che sia messo l'output:



Come potete vedere, invece di scrivere i nomi di tutti i file, il comando crea un nuovo file nella home directory; proviamo a vederlo con il comando cat. Se tornate indietro, ricorderete che cat era un comando apparentemente inutile che copiava quello che scrivevate (lo standard input) sul terminale (standard output). cat può anche stampare un file sullo standard output se gli date il file come parametro:



L'output esatto del comando ls /usr/bin appare nel contenuto di lista. Tutto bene, anche se questo non ha risolto il problema originale.gif

Comunque, cat fa qualcosa di interessante quando il suo output viene rediretto. Cosa fa il comando cat lista > nuovofile? Normalmente, > nuovofile dice ``prendere tutto l'output del comando e metterlo in nuovofile''. L'output del comando cat lista è il file lista. In questo modo abbiamo inventato un metodo nuovo (e non molto efficiente) per copiare i file.

E che dire del comando cat > pippo? cat da solo legge ogni linea inserita dal terminale (standard input) e stampa tutto nello standard output finché non legge tex2html_wrap4527. In questo caso, lo standard output è stato rediretto nel file pippo. Adesso cat è servito come un rudimentale editor (programma per scrittura testi):

/home/larry$ cat > pippo
Oggi è una bella giornata.
premete Ctrl-d

Abbiamo creato quindi il file pippo che contiente la frase ``Oggi è una bella giornata''. Un altro uso del versatile comando cat è con catenare più file insieme: cat stampa tutti i file che gli vengono passati come parametro, un file dopo l'altro. Così il comando cat lista pippo stampa il listato della directory /usr/bin, e poi la nostra frase. In questo modo, il comando cat lista pippo > listaepippo creerà un nuovo file contenente sia lista sia pippo.

 

Redirezione dell'input

 

Come per lo standard output, è anche possibile redirigere lo standard input . Un programma, invece di leggere dalla tastiera, legge da un file. Siccome la redirezione dell'input è collegata alla redirezione dell'output, sembra naturale che il carattere speciale per la redirezione dell'input sia <. Anche questo deve essere usato dopo il comando da eseguire.

La redirezione dell'input è utile generalmente se avete un file di dati e un comando si aspetta dell'input dallo standard input. La maggior parte dei comandi permettono di specificare un file su cui operare, così < non è molto usato nelle normali operazioni giornaliere come altre tecniche.

 

Soluzione: i pipe

 

Molti comandi Unix producono una grande quantità di informazioni. Per esempio, non è strano per un comando come ls /usr/bin produrre più output di quello che potete vedere su una sola schermata. Per riuscire a vedere tutte le informazioni di un comando come ls /usr/bin, è necessario usare un altro comando Unix, chiamato more .gif more si ferma ad ogni videata di informazioni. Per esempio, more < /etc/rc mostra il file /etc/rc, esattamente come farebbe cat /etc/rc, eccetto che vi permette di leggerlo. more permette anche la forma more /etc/rc, ed è questo il modo normale di invocarlo.

Comunque, questo non risolve il problema che ls /usr/bin mostra più informazioni di quelle che potete vedere. more < ls /usr/bin non funziona--la redirezione dell'input funziona solamente con i file, non con i comandi! Potreste fare questo:



Unix dà un modo più pulito per fare la stessa cosa. Potete usare il comando ls /usr/bin | more. Il carattere ``|'' indica una pipe (conduttura). Come una conduttura dell'acqua, una pipe Unix\ controlla il flusso. Invece di acqua, stiamo controllando il flusso di informazioni!

Uno strumento utile con le pipe sono i programmi chiamati filtri . Un filtro è un programma che legge lo standard input, lo elabora in qualche modo e manda i risultati sullo standard output. more è un filtro--legge i dati che provengono dallo standard input e li visualizza sullo standard output una videata alla volta, permettendovi di leggere il file. more non è un granché come filtro, dato che il suo output non può essere usato come input per un altro programma.

Altri filtri sono i programmi cat , sort , head  e tail . Per esempio, se volete leggere solo le prime dieci linee dell'output di ls, potete usare ls /usr/bin | head.

 


next up previous contents index
Next: Multitasking Up: Lavorare con Unix Previous: Risparmiare tempo con bash


Fri Sep 19 00:41:53 CEST 1997