In questa parte del tutorial vedremo come effettuare il Piping e il Redirect dei comandi. Ovviamente il tutto è corredato da un insieme di esempi a fini esplicativi!!
PIPING E REDIRECT
Poiché i comandi Unix sono dei “filtri” è possibile redirigere l’output di un comando verso altre destinazioni (file, stdin, stdout):
comando < file_input[/shell] utilizza file_input come standard input. Di solito lo standard input è la tastiera; [shell]comando > file_output
scrive l’output del programma su file;
comando >> file_output
scrive l’output del programma sul file in append.
ESEMPI
ls /home/user/documenti/ > contenutodirectory
scrive la lista dei file della directory corrente, all’interno del file contenutodirectory;
sort file2
ordina il contenuto di file1 e lo scrive su file2;
E’ possibile utilizzare lo standard output di un comando come standard input di un altro (Piping). Per scrivere una serie di comandi in piping bisogna utilizzare l’operatore “|” .
ESEMPI
ls ./ | grep documenti
cerca tra i file contenuti nel direttorio quelli che si chiamano “documenti”;
who | wc -l > num_utenti
who preleva il numero di utenti, wc conta il numero di parole nella lista, il risultato viene scritto sul file num_utenti;
ls | rev
lista dei file sul direttorio corrente in ordine invertito.
METACARATTERI ED ESPANSIONE
La shell unix riconosce dei caratteri speciali:
- * : uno o una sequenza qualsiasi di caratteri contenuti nel nome di un file;
- ? : un carattere qualsiasi;
- [zfc] : un carattere qualsiasi tra ‘z’,’f’,’c’, nel nome di un file;
- [a-g] : qualsiasi carattere compreso tra ‘a’ e ‘g’ nel nome di un file;
- \ : escape, il carattere successivo viene interpretato come un normale carattere;
- ` ` : backquote, tutto ciò che c’è al loro interno viene interpretato come se fosse un comando (si scrivono schiacciano alt destro + apostrofo);
- “ ” : inibisce l’interpretazione di *, ?, [ ], < , > , >>, !
- # : commento
- #! : all’inizio del file indica quale programma utilizzare per interpretare il file di testo
ESEMPI DI ESPANSIONE
ls *.*
ritorna tutti i file che contengono al loro interno un punto.
In questo caso, quindi, il comando riconosce ciao.exe , ecco.jpg ma non riconoscerà né .ciao né tantomeno ecco. poiché il metacarattere * indica una sequenza di UNO o più caratteri;
ls Foto????-??-??
filtra, ad esempio, il file Foto2001-01-10 ma non Foto2001-1-10;
Tutte le variabili shell sono STRINGHE. Il loro valore si riferisce come $var.
Per forzare l’interpretazione di una variabile come se fosse un numero è necessario utilizzare il comando expr!
ESEMPI
X=2 # X vale 2 (attenzione perchè per gli assegnamenti NON BISOGNA UTILIZZARE MAI SPAZI!!! echo $X # stampa “2” echo X # stampa “X” echo `expr 1 + 3` # stampa “4” echo expr 1 + 3 # stampa “expr 1 + 3”
Se non utilizzo i backquote “expr 1 + 3” non viene sostituito con il risultato del comando e viene, quindi, interpretato come se fosse una stringa!!!
echo “<`pwd`>” # stampa “”
Da notare che i doppi apici hanno evitato che l’interprete effettuasse una redirezione dell’input e dell’output!!!
In generale l’interprete shell sostituisce i vari caratteri speciali come segue:
- Redirezione dell’input e dell’output ( echo > hello );
- Sostituzione backquote con risultato dei comandi ( `pwd` viene sostituito con “/home/user/documenti/”);
- Sostituzione di variabili ( $HOME viene sostituito con “/home/Michele/”);
- Sostituzione dei metacaratteri ( ci*o viene sostituito con “ciao” e “ciano”);
Vai alla parte 1 – Intruduzione shell unix,file system,utenti,gruppi
Vai alla parte 3 – Costrutti IF-FOR-WHILE, Riepilogo comandi