Vuoi migliorare questa domanda? Aggiungi dettagli e chiarisci il problema modificando questo post.
Chiuso 4 anni fa.
Migliora questa domanda
Dopo aver incontrato circa 3 tee
spiegazioni che considero poco didattiche, chiederei una spiegazione semplice, generale e graduale (se possibile) su questo comando, rivolto ai nuovi arrivati di Linux.
Capisco che lo usiamo tramite una pipe, sullo stdout di un comando o, in alternativa, direttamente un determinato file, ma penso che mi manchi ciò che il comando fa effettivamente con questo contenuto e quando è utile.
Quindi ecco cosa chiedo, sperando di trovare una spiegazione didattica, servita ai nuovi arrivati in modo chiaro e graduale:
-
Come funziona il comando con lo stdout di un comando o, in alternativa, con i file stessi?
-
Perché è comune dire
tee
legge l'input standard? Voglio dire, se facciols -l
,tee
non legge la sintassils -l
stesso ma piuttosto lo stdout stampato nella sessione.
Inoltre, se vuoi, condividi un esempio pratico tratto dal tuo lavoro quotidiano su quando tee
ti è molto utile?
Risposta accettata:
Dal tee
manuale sul mio sistema:
L'utility tee copia lo standard input in standard output, effettuando una copia
in zero o più file. L'output è senza buffer.
Quindi, legge dallo standard input e lo copia nello standard output, duplicando anche il flusso in uno o più file.
Nella pipeline seguente, tee
prenderebbe l'output del primo comando nella pipeline e lo copierebbe nello standard output (il terminale) facendone anche copie nei file one
, two
e three
:
$ somecommand | tee one two three
tee
ha molti usi, uno è in combinazione con sudo
per reindirizzare l'output a un file di proprietà di root:
$ somecommand | sudo tee /root/somefile >/dev/null
Quanto segue non hanno funzionato poiché il reindirizzamento avviene come utente non privilegiato (avrebbe anche eseguito somecommand
come root che potrebbe essere indesiderato):
$ sudo somecommand >/root/somefile
Un esempio artificiale di aggiungere un insieme fisso di righe a più file contemporaneamente (a tutti gli utenti ~/.profile
file, supponendo che il *
si espande ai nomi utente e che la riga di comando espansa non diventi troppo lunga per essere gestita dalla shell):
$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH
Un vero esempio di utilizzo di tee
:
time doas box-build.sh 2>&1 | tee build.out | grep '^=*>'
Questo sono io che costruisco il sistema di base OpenBSD. doas
è l'“equivalente” OpenBSD di sudo
e box-build.sh
è un piccolo script di shell che fa la costruzione (essenzialmente cd /usr/src && make obj && make build
). Vorrei archiviare l'output dell'intero processo di compilazione, inclusi eventuali errori o avvisi, ma non voglio che tutto venga riversato nel mio terminale. A tal fine utilizzo tee
per salvare tutto in build.out
e poi grep
solo per avere un'idea di dove ci troviamo nel processo nel terminale.