La redirezione dell’I/O

()

Si è dedicata una sezione separata a questa funzionalità della shell per la sua particolare rilevanza, dato che e proprio la redirezione delle operazioni di I/O che ci permette di costruire quella catena di montaggio che consente di combinare le capacità dei vari comandi ed ottenere l’effettiva potenza della riga di comando.

Come accennato in un sistema unix-like i programmi si aspettano di avere disponibili e già aperti tre file: standard input, lo standard output e lo standard error.

Seguendo una convenzione comune, i comandi si aspettano di ricevere i loro dati in ingresso sullo standard input (e non da uno specifico file o dispositivo, a meno che questo non sia previsto come argo-mento), mentre scrivono i loro dati in uscita sullo standard output.

Lo standard error in caso di operazioni regolari non viene mai usato; su di esso vengono scritti solo gli eventuali messaggi di errore.

Quando si usa l’interfaccia a riga di comando standard input, standard output e standard error vengono aperti nella procedura di accesso al sistema e sono tutti associati al terminale su cui viene eseguita la shell.

Dato che, i file aperti vengono ereditati dai processi figli, normalmente quando la shell lancia un comando questi le restano gli stessi anche per lui, che pertanto potrà ricevere i dati in ingresso dalla tastiera e scrivere i suoi risultati sullo schermo.

Per capire meglio il significato della redirezione prendiamo come esempio il comando cat.

Questo e un comando elementare che serve a leggere uno o piu le in ingresso, passati come argomenti, e a scriverne il contenuto sullo standard output. Se non si speci fica nessun file come argomento il comando legge di default dallo standard input, per cui se eseguiamo:

piccardi@anarres:~$ cat

ci troveremo in una situazione in cui il comando si blocca sulla riga successiva in attesa che scriviamo qualcosa sul terminale.

Se lo facciamo scrivendo prova seguito da invio otterremo qualcosa del tipo:

piccardi@anarres:~$ cat

prova

prova

dove il comando reagisce all’invio ristampando sul terminale quanto appena scritto e attendendo nuovi dati in ingresso.

Questo avviene in quanto sul terminale si ha quello che si chiama I/O bufferizzato ed i dati in ingresso vengono letti e scritti una riga alla volta, per cui alla pressione dell’invio verra letto quanto appena scritto, ed il comando lo riscrivera sullo standard output; per uscire dal comando occorre nel caso indicare che la lettura e conclusa, ad esempio inviando un end-of- le sull’input con C-d, o interrompere il programma con un segnale.

Usato cosi il comando non e di grande utilita, dato che in genere non serve a molto scrivere qualcosa sulla tastiera per vederselo ristampare sul terminale ad ogni riga; pero se vogliamo vedere il contenuto di un le il modo piu immediato per farlo e con un comando del tipo:

piccardi@anarres:~$ cat /etc/profile

  • /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
  1. and Bourne compatible shells (bash(1), ksh(1), ash(1), …).

PATH=”/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games”

dato che il comando leggera il contenuto del file e lo riversera sullo standard output, ed essendo quest’ultimo collegato al terminale, lo si vedra sullo schermo.

Fin qui l’utilita del comando è relativa, dato che programmi per visualizzare il contenuto del file ce ne sono altri, magari piu sofisticati come more e less, che permettono anche di vedere il file un pezzo alla volta, e andare avanti e indietro, senza scrivere tutto il file in un colpo solo sul terminale, per cui l’inizio va perso nello scorrimento dello schermo.

Il comando comunque prende alcune opzioni per facilitare la visualizzazione, come :

-n che stampa un numero progressivo per ogni riga,

-t che stampa i tabulatori come ^I,

-v che visualizza i caratteri non stampabili, e

-E che scrive un $ alla fine di ogni riga.

La descrizione completa si trova al solito nella pagina di manuale, accessibile con man cat.

Ma la vera utilita di cat, il cui scopo in realtà non è quello di mostrare il contenuto di un file, emerge solo quando esso viene unito alla capacità della shell di modificare i file associati a standard input, standard output e standard error, cioe con la redirezione dell’I/O.

Per fare questo la shell riconosce sulla riga di comando alcuni caratteri che svolgono la funzione di operatori, detti appunto operatori di redirezione. I due operatori piu elementari sono \<” e \>” che permettono rispettivamente di redirigere lo standard input e lo standard output sul le speci cato dall’utente dopo l’operatore.

In realtà si può e ettuare la redirezione di un qualunque le descriptor usato da un pro-gramma, speci cando il suo numero prima dell’operatore, questo comporta ad esempio che per redirigere lo standard error si usa l’operatore”2>” dato che esso e associato al le descriptor 2, ma si potrebbe utilizzare allo stesso modo “3>” per redirigere il le descriptor 3; i dettagli sulle varie forme di redirezione si possono trovare nella pagina di manuale alla sezione \REDIRECTION“.

Cominciamo allora a vedere come si usano questi due operatori. Una modalit alternativa di stampare il contenuto di un le con cat e utilizzare un comando del tipo:

piccardi@anarres:~$ cat < /etc/profile

/etc/profile: system-wide .profile file for the Bourne shell (sh(1))

and Bourne compatible shells (bash(1), ksh(1), ash(1), …).

La redirezione dell’output avviene in maniera identica associando con “>” lo standard output ad un file. Ad esempio si potra copiare il contenuto del le pippo sul le pippo2 utilizzando un comando del tipo:

cat pippo > pippo2

La redirezione dell’output avviene in maniera identica associando con “>” lo standard output ad un le. Ad esempio si potra copiare il contenuto del le pippo sul le pippo2 utilizzando un comando del tipo:

cat pippo > pippo2

dato che con questa redirezione invece che sul terminale il contenuto di pippo sarà scritto su pippo2.

Fin qui niente di particolarmente utile, dato che nel primo caso si sarebbe potuto leggere direttamente il le, mentre nel secondo si sarebbe potuto usare direttamente cp.

Pero, e qui emerge anche la vera utilita del comando cat, con cp si puo solo copiare il contenuto di un file su un altro, ma cosa succede invece se con cat specifichiamo come argomenti una serie di file da leggere e poi redirigiamo l’uscita su di un altro file ?

Per quanto abbiamo detto in questo caso cat leggerà il contenuto di ciascuno dei file passati come argomenti, riscrivendo il tutto sullo standard output.

Avendo rediretto lo standard output su un altro le il risultato sar che quest’ultimo avr come contenuto la concatenazione del contenuto di tutti i le passati come argomenti a cat, ed infatti il nome del comando, non proprio intuitivo, deriva da concatenate file.

Cosi se si è spezzato un file di grosse dimensioni in una serie di file piu piccoli (ad esempio per scriverlo su una serie di CD) si potra ricostruirlo con un semplice comando del tipo:

cat pezzo1 pezzo2 pezzo3 … > filecompleto

La redirezione dello standard input e invece molto utile con i programmi che richiedono l’immissione dei dati da tastiera, specie quando questi vengono eseguiti in uno script. Una volta definiti quali dati sono necessari infatti li si potranno scrivere in un file, e farli leggere al programma semplicemente con la redirezione dello standard input.

/ 5
Grazie per aver votato!

How useful was this post?

Click on a star to rate it!

Average rating / 5. Vote count:

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?