Experimentalia

Appunti raminghi

Bash tee

with one comment

No, il te (preferisco il lapsang souchong) non c’entra nulla. Il protagonista di questo rapido post è il comando tee che permette di duplicare il suo standard input e salvarne una copia su file mentre l’altra viene reindirizzata allo standard output.

Attenzione: tee si disinteressa dello standard error (che magari è più interessante da tracciare) perché |, il simbolo di pipe, inoltra un solo flusso alla volta, di solito stdout.

I parametri utili sono solamente due,

  • -a che permette di aprire in modalità append il file su cui riportare il flusso di dati che passa attraverso tee
  • -i che istruisce tee ad ignorare gli interrupt che dovessero raggiungerlo.

A cosa può servire un comando del genere? Per prima cosa è utile per salvare un risultato intermedio dall’interno di una pipe, ad esempio per fare debug o per manipolare successivamente, in maniera differente da quella implementata nella pipe gli stessi dati.
Una obiezione naturale potrebbe essere: peché non dividere l’elaborazione in due parti, salvare i dati in un file ed utilizzarli successivamente per far partire due elaborazioni parallele? Essenzialmente si tratta si gusti personale, o per dirla come Larry Wall, esistono più modi di scuoiare un gatto. Un’altro motivo che rende controindicato spezzare l’elaborazione in più parti, specie in caso di test, può essere l’alta variabilità dell’output di un comando, se l’output varia ogni volta che lanciamo un comando, lanciarlo e per vedere l’output che produce non basta perché un eventuale errore non sarebbe così individuabile.
Un altro utilizzo che se ne può fare è utilizzarlo come un semplice registratore dell’output di uno script (basta piazzare in fondo alla riga di comando un | tee file.log) .

Una cosa importante da valutare è che tee nasconde il codice d’uscita del programma di cui replica l’output. Verifichamolo:

Costruiamo un semplice script (test):

#!/bin/bash
echo Ciao
exit 1

e digitiamo a linea di comando:

./test ; echo $?

$? non è altro che l’exitlevel della pipe al momento della valutazione (nel nostro caso il valore restituito dallo script test) e, correttamente la linea di comando stampa 1. Non c’è bisogno che ve lo dica, la pipe

./test|tee ; echo $?

stampa 0. Si tratta dell’exitlevel di tee che, ovviamente, è zero.

Questo significa che uno script che fa affidamento sull’exit code di un comando precedente potrebbe non funzionare.

Written by Eineki

maggio 23, 2008 a 23:24 pm

Pubblicato su bash, linux

Una Risposta

Subscribe to comments with RSS.

  1. […] i file descriptor Pubblicato su bash, linux, quick fix by eineki su Luglio 9th, 2008 In un precedente pezzo ho scritto qualche parola su tee e vi raccontavo che la sua principale limitazione era […]


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: