Press "Enter" to skip to content

Il comando tee linux – Guida completa con esempi

In questo post vedremo il comando tee linux, un comando semplice e senza molte opzioni ma che comunque può essere molto utile in alcune occasioni.

Cos’è e cosa fa il comando tee linux

Il comando tee prende il nome dai raccordi a T utilizzati solitamente in idraulica per “sdoppiare” un flusso in due. Capiamo quindi subito dal nome che questo comando potrebbe servire per sdoppiare qualcosa.

Raccordo a T per idraulica
Raccordo a T per idraulica
Clicca l’immagine per ulteriori informazioni

In effetti il comando linux tee fa proprio questo: prende il contenuto dello standard input, lo stampa a schermo e contemporaneamente lo scrive su uno o più file.

Si tratta quindi di un comando molto comodo se abbiamo necessità di scrivere qualcosa su più di un file.

Come vedremo possiamo sfruttare le potenzialità di questo comando anche quando abbiamo semplicemente necessità di scrivere l’output di un comando in un file, ma al contempo vogliamo anche vedere in tempo reale cosa stiamo scrivendo. In questo caso infatti l’operatore di redirezione > non può aiutarci in quando redireziona l’output dentro al file di destinazione senza permetterci di vederlo.

Il comando tee dovrebbe essere compreso in quasi tutte le distribuzioni linux come parte del pacchetto GNU Coreutils. Oltre a tutti i sistemi linux, troviamo il comando tee su mac OS, quindi anche sul terminale del vostro mac potrete sfruttare questo piccolo tool.

Sintassi base di tee

La sintassi di base del comando tee è abbastanza semplice. basta fornire come parametro il nome del file su cui vogliamo scrivere e il gioco è fatto.

tee output.txt

Il comportamento predefinito di tee è lo stesso dell’operatore di redirezione > ovvero quello di sovrascrivere il file di destinazione.

Se il file di destinazione non è presente verrà creato automaticamente all’esecuzione del comando.

Scrivere contemporaneamente su più files

Con tee abbiamo detto che è possibile scrivere su uno o più files per volta. La scrittura su più file si può ottenere semplicemente fornendo come argomenti tutti i nomi dei file su cui scrivere.

tee output1.txt output2.txt output3.txt

In questo caso ciò che arriva in input stream a tee verrà visualizzato sul terminale e scritto sui tre file indicati.

Appendere invece di sovrascrivere

Abbiamo detto che in modo predefinito il comando tee si comporta come il comando di redirezione > sovrascrivendo il file di destinazione se già esistente.

In alcuni casi però potremmo volere un comportamento simile a quello dell’operatore di redirezione >> ovvero appendere in coda a uno o più files esistenti senza cancellarne il contenuto.

In questo caso possiamo usare l’opzione -a che fa proprio questo. La sintassi del comando è quindi la seguente:

tee -a output.txt
tee -a output1.txt output2.txt output3.txt

Nel primo caso il comando tee appenderà a un singolo file, nel secondo lo farà contemporaneamente su tutti e tre i files specificati.

Tee con input da file

negli esempi precedenti, usando il comportamento predefinito di tee, dovremmo scrivere sul terminale ciò che vorremmo inserire nei file di destinazione. Possiamo però usare come standard input l’output di un altro comando attraverso una pipe. Le pipe servono appunto a incanalare (o meglio intubare, data la traduzione di pipe dall’inglese con tubo) l’output di un comando nell’input di un altro.

Possiamo quindi ad esempio usare l’output di un comando cat per fornire input a tee.

cat /etc/passwd | tee output.txt

In questo caso quello che succederà è che l’output del comando cat /etc/passwd diventerà l’input del comando tee output.txt che quindi lo mostrerà a schermo, lo scriverà nel file output.txt, e poi il comando terminerà.

comando tee con input da file
Comando tee con input da file

Ignorare i segnali di interrupt

Quando si usa il terminale, che sia una shell bash, zsh o altre, si impara abbastanza presto che la combinazione <Ctrl> + c permette di inviare un segnale di interrupt per terminare il processo in esecuzione prima che finisca naturalmente.

Il comando tee è provvisto di una particolare opzione che permette di ignorare questi segnali di interrupt. L’opzione è -i, probabilmente potrebbe non capitarvi mai di usarla ma è comunque una delle (poche) feature di questo comando.

Concatenare file multipli

Sfruttando le potenzialità del comando cat, delle pipe e di tee, è possibile concatenare più files e scrivere il risultato su uno o più files.

cat file1.txt file2.txt | tee file1_2.txt

Salvare un file come root in vim

A chi usa regolarmente il terminale per la gestione del proprio sistema linux sarà sicuramente capitato di aprire un file con vim, editarlo come desiderato e solo alla fine rendersi conto che non abbiamo le autorizzazioni per salvare il nostro lavoro (ad esempio il file è dell’utente root e non abbiamo usato sudo per aprire vim).

Niente paura, ci viene in soccorso il comando tee. Si tratta in questo caso di una situazione in cui probabilmente non ci verrebbe mai in mente di usare il comando tee, ma invece questo piccolo ma potente tool ci offre la soluzione.

Quando abbiamo finito le nostre modifiche basterà usare questa riga per salvare il nostro lavoro.

:w !sudo tee %

Come abbiamo visto nel post dedicato al comando vi, l’operazione :w permette di salvare il lavoro sul file. In questo caso sarà necessario appendere qualche altro comando per far si che riusciamo ad elevare i nostri privilegi a quelli di root prima di andare a scrivere il file.

Con !sudo diciamo a vim di chiamare il comando sudo.
Con tee diciamo a vim di inoltrare al comando tee l’output prodotto.
Con % diciamo a tee (a questo punto in possesso dei privilegi necessari ottenuti tramite !sudo) di scrivere sul file corrente.

Con questo piccolo trucco avremo salvato il file senza dover perdere tutte le modifiche fatte!

Scrivere come root un output non generato da root

Sulla scia dell’esempio precedente, possiamo pensare di usare sudo tee per elevare i privilegi su un output che non ne ha. Possiamo quindi eseguire un comando senza privilegi, inoltrarne l’output tramite pipe, e poi scriverlo su un file che richiede privilegi tramite il comando tee.

Vediamo un esempio di questo caso.

echo "nuova riga di config" | sudo tee -a /etc/informaticappunti.conf

In questo esempio abbiamo generato la stringa “nuova riga di config” tramite il comando echo eseguito senza privilegi. Successivamente abbiamo inoltrato tramite pipe l’output a sudo tee -a che quindi otterrà i privilegi per scrivere il file in /etc/.

Ovviamente questa strategia è particolarmente efficace quando non potete fidarvi dell’esecuzione del comando iniziale che quindi non può essere eseguito con privilegi di root.

cat, sudo e tee
cat, sudo e tee

Conclusioni

Il comando linux tee ha una semplice funzione: legge da standard input e scrive lo standard output in uno o più file.

Pur essendo molto semplice, il comando tee in linux permette di risolvere diversi problemi anche quando non ce lo aspettiamo o non ci verrebbe subito in mente di usarlo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.