Skip to main content
  1. Comandi/

tee - duplica stdout su file

·2 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

Cosa fa
#

Legge da stdin e scrive contemporaneamente su stdout e su uno o piu' file. Il nome viene dal raccordo a T dell'idraulica: il flusso si divide in due direzioni.

Sintassi
#

comando | tee [opzioni] file

Comandi essenziali
#

ComandoFlagSignificato flagCosa fa
tee file.txtScrive su stdout e sovrascrive file.txt
tee -a file.txt-aappendScrive su stdout e aggiunge in coda al file
tee file1 file2Scrive su stdout e su piu' file contemporaneamente

Pattern sudo tee — scrivere file di sistema
#

echo e cat non possono scrivere in file protetti da root anche con sudo echo > — il redirect > viene eseguito dalla shell dell'utente, non da root.

sudo tee risolve il problema: il privilegio va al processo che apre il file.

# SBAGLIATO — il redirect > viene eseguito come utente, non come root
sudo echo "contenuto" > /etc/file-protetto

# CORRETTO — tee gira come root e apre il file
echo "contenuto" | sudo tee /etc/file-protetto

# Con append
echo "contenuto" | sudo tee -a /etc/file-protetto

# Silenziare stdout (solo scrittura su file)
echo "contenuto" | sudo tee /etc/file-protetto > /dev/null

Pattern heredoc + sudo tee — scrivere blocchi multiriga
#

Per scrivere file di configurazione multiriga senza editor:

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

Il <<EOF e' un heredoc: tutto il testo fino alla riga EOF finale viene passato come stdin a sudo tee. Vedi heredoc per la sintassi completa.

La subshell $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}"):

  • . /etc/os-release — source del file, carica le variabili OS nell'ambiente
  • ${VAR:-fallback} — usa UBUNTU_CODENAME se esiste, altrimenti VERSION_CODENAME

Scenario Reale
#

Configurazione repo Docker su Ubuntu: il file /etc/apt/sources.list.d/docker.sources e' protetto da root. Con heredoc + sudo tee si scrive il contenuto multiriga in un solo comando senza aprire un editor come root.

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: jammy
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc
EOF

Analista SOC che analizza traffico live e vuole salvarlo:

tcpdump | tee network_capture.log

Collegato a
#

Related