next up previous contents
Next: Il manuale in linea Up: Un punto di forza Previous: Visualizzazione, creazione, modifica e

La redirezione e la pipe

Come è già stato detto, su UNIX si ha sempre una definizione rigorosa di stdin, stdout e stderr. Normalmente, coincidono tutti e tre con il terminale su cui si sta usando la shell, ma possono essere reindirizzati separatamente; inoltre la ``pipe'' permette di far interagire due processi (due comandi), ad esempio collegando lo stdout dell'uno allo stdin dell'altro.

Facciamo un esempio. Supponiamo di voler tenere da parte l'elenco dei file ottenuto con il comando ls, senza doverlo stampare, magari per portarlo con floppy (o tramite collegamento in rete) su un'altra macchina. Normalmente la risposta al comando viene visualizzata sul terminale, ma si può redirigere lo stdout di ls su un file apposito, usando il carattere ``>'':

$ ls > lista.txt
In questo modo, sullo schermo non viene visualizzato niente; quando la shell restituisce il prompt si può facilmente verificare che l'elenco desiderato è stato salvato nel file lista.txt. Se tale file non esisteva, viene creato appositamente; se esisteva, tale operazione cancella completamente il suo contenuto precedente. Quest'ultimo effetto può essere voluto, ma in altri casi si può semplicemente voler ``accodare'' al contenuto precedente del file; in tal caso basta usare ``>>'' al posto di ``>''. Per redirigere lo stderr anziché lo stdout basta usare ``2>'' anziché ``>''. In altri casi può servire la redirezione dello stdin; ad esempio, potremmo aver scritto e compilato un programma C che legge dati che l'utente inserisce sul terminale e fornisce i corrispondenti risultati sempre sul terminale (stdout). Se vogliamo che legga i dati da un file e per qualche motivo non vogliamo modificarlo perché accetti il nome di questo file come argomento sulla linea di comando, possiamo sempre redirigere lo stdin come segue:
$ input.dat < calcola
dove input.dat è il file di dati in ingresso e calcola è l'eseguibile prodotto tramite compilazione. Se inoltre vogliamo che i dati di uscita vengano salvati su un file, possiamo usare il comando
$ input.dat < calcola > output.dat
in cui per calcola vengono rediretti sia stdin che stdout. È anche possibile redirigere su file e al tempo stesso ottenere l'uscita sul video, usando il ``T'' (tee), ma tralasciamo questo aspetto.

Passiamo invece a illustrare la pipe. Supponiamo di voler visualizzare sul terminale l'elenco dei file di una directory ``affollata''. Se diamo semplicemente il comando ls vediamo un rapido ``scroll'' che ci impedisce di leggere correttamente tutte le informazioni desiderate. Potremmo redirigere l'output di ls su un file, per poi consultarlo tramite more o less, come visto prima. Alla fine, potremmo rimuovere il file di appoggio prodotto. È molto più logico evitare di passare per un file di appoggio: basta utilizzare congiuntamente ls e less come segue

$ ls | less
Il segno ``|'' indica la ``pipe'' e specifica che lo stdout di ls deve essere usato come stdin per less. Ovviamente, la pipe può essere usata anche in modo da coinvolgere lo stderr di un processo, lo si lascia per esercizio anche perché non serve così spesso.

In questo paragrafo sono stati mostrati esempi molto semplici dell'uso della redirezione e della pipe. Tuttavia, il lettore attento può facilmente intuire che gli oltre 300 comandi a disposizione dell'utente, con tutte le loro opzioni e le combinazioni che si possono ottenere tramite redirezione e pipe, rendono la shell di UNIX uno strumento di straordinaria potenza, oltre che estremamente diretto, senz'altro non superabile da combinazioni di finestre e bottoni, con tutto il rispetto per tanti geniali programmatori di interfacce grafiche.


next up previous contents
Next: Il manuale in linea Up: Un punto di forza Previous: Visualizzazione, creazione, modifica e

1999-05-16