I/O redirection AND PIPES
STDIN, STDOUT, STDERR In Linux tutto è un file, di conseguenza Stdin (un canale per l'input dei programmi, potrebbe essere anche un file) Stdout (un canale per il risultato dei programmi) Stderr (un canale per l'elenco degli errori dei programmi) A livello predefinito stdout e stderr non vanno in un file, affinché finiscano in questo si usa la tecnica chiamata redirection
Ridirezione dell'output comando > nome_file Esempio ls /home/luca > ls_result.txt proviamo invece a generare un errore (poniamo che /home/pippo non esista ls /home/pippo > ls_result.txt ls: cannot access /home/pippo: No such file or directory (l'errore però non è finito nel file, che rimane vuoto, ma è andato nella standard error) Il file però si è sovrascritto e se vogliamo che i risultati dei vari comandi si aggiungano uno sotto l'altro? (v. slide successiva)
Ridirezione dell'output ls /home/pippo >> ls_result.txt In questo caso l'operatore >> non sovrascrive il file precedente se esiste già, ma si posiziona alla fine del file e comincia ad accodare il nuovo contenuto.
Ridirezione degli errori ls /home/pippo 2> file.txt In questo caso si usa il file descriptor 2 (codifica utilizzata internamente dalla shell per accedere ai 3 diversi canali) che si riferisce allo stderr Lo stdin presenta il file descriptor 0 Lo stdout presenta il file descriptor 1
Stdout e stderr in un solo file /home/luca/pippo > ls-output.txt 2>&1 /home/luca/pippo &> ls-output.txt /home/luca/pippo &>> ls-output.txt
Gestire i messaggi indesiderati ls -l /bin/usr 2> /dev/null
Redirezione stdin cat nome_file_1, ….., nome_file_n cat senza argomenti Prende in input del testo e lo restituisce nello stdout Fino a che non si preme CTRL+D cat > file.txt
Pipelines comando1 | comando2 Lo standard output del comando1 diventa lo stdin del comando2 Esempio ls /home/luca | less
uniq Accetta una lista già ordinata (usa il comando sort) e se nella lista ci sono elementi ripetuti li esclude Esempio ls /home/luca | sort | uniq
wc Numero di righe, parole e bytes contenuti in un file
grep ls /home/luca | sort | uniq | grep 'prov' Nella lista di file quelli che contengono la parola prov
Tail e head Tail restituisce le ultime 10 righe di un file Head restituisce le prime 10 righe di un file Se vogliamo specificare il numero di righe da visualizzare, possiamo utilizzare l'opzione -n Esempio ls /home/luca | sort | uniq | tail -n 5 Visualizzare le ultime 5 righe Se vogliamo vedere il progresso di un file in tempo reale, possiamo utilizzare l'opzione -f, utilissimo se per esempio stiamo programmando un'applicazione che restituisce un errore e vogliamo vedere il log dell'errore che si è verificato
Esercizi 1. Abbiamo un cartella di nome /home/luca 2.Creiamo una cartella prova 3. Ci spostiamo in tale cartella 4. Creare un file di testo tramite il comando cat opportunamente 5. aggregare due file insieme, ordinare le righe dei due file, rimuovere i duplicati, filtrare solo le righe che contengono la parola “prova” e creare un file con il risultato di tutte queste operazioni 6. aggiungere una riga alla fine risultato dell'operazione 5