C'è qualche significato nell'usare il tee?


47

Perché quasi tutte le istruzioni relative all'aggiunta di testo ai file di sistema piacciono fstabe /etc/apt/sources.list.d/<name>.listimplicano l'uso tee e echo l'apposizione di detto testo?

Prendi i seguenti esempi, che vengono eseguiti come root :

## 1
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee -a file1
## 2
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' >> file2

La corsa diff -u file1 file2non restituisce nulla; la corsa md5sum file1 file2mostra che i loro checksum sono identici, il che mi riporta alla mia domanda originale:

Perché è | tee <FILENAME>così diffuso tra i documenti di Ubuntu, è solo una buona pratica, altrimenti non sarebbe più semplice usare solo l'esempio 2 invece di passare l'output da echoa tee?


1
Ti manca sudo nei tuoi comandi; che mostrerà risultati diversi tra i 2;)
Rinzwind

1
@Rinzwind Sto eseguendo questi comandi come root.
Alexej Magura,

Risposte:


84

C'è una differenza: tee duplica l'output: lo invia sia al file che al display.

Ma c'è di più:

  • Ad esempio, se si desidera scrivere una stringa in due file contemporaneamente, il comando con tee che è possibile utilizzare è:

     echo "some text" | tee file1 > file2  
    
  • Un'altra cosa che ti può aiutare è quella di evitare un problema quando usi sudo. Il normale operatore di reindirizzamento dell'output viene sempre eseguito con i privilegi dell'utente, anche quando si scrive un sudo davanti al comando che genera il testo STDOUT. In altre parole, ciò non riuscirà se non si dispone dell'autorizzazione per scrivere su quel file:

     sudo echo "something" > bar  
    

    Ma con il tee, tutto andrà bene:

    echo "something" | sudo tee bar  
    

2 esempi da questo sito . Ne ha ancora un po '.


Puoi sudosenza tee- sudo sh -c 'echo SOMETHING > FILE'...;)
Wilf,

7
@wilf sì, ma quando hai bisogno di emettere citazioni ", le cose diventano disordinate
Braiam

3
Nel primo caso, se vuoi scrivere su N file, preferirei echo "some text" | tee file1 file2 ... fileNe forse aggiungerei > /dev/null, se non vuoi disordine su stdout.
Elmar Zander,

Nice one @ElmarZander :)
Rinzwind

13

teeaccetta il flusso di input standard e lo scrive sia nel flusso di output standard che in un flusso di file. Se aiuta le persone a ricordare, il nome del comando deriva da un T-splitter nell'impianto idraulico. C'è un bell'articolo di Wikipedia in cui ho imparato a conoscere l'origine del nome del comando.

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


11

Prima di tutto, di per teesé non aggiunge testo, né lo fa >.

È tee -ae il suo complemento >>che APPENDE il testo.

Non credo che tutte le shell supportino la >>funzione, ecco perché teeè più comunemente usata. (Pensa solo alla vecchia sh). Tee è un comando, mentre >>è un operatore.

Se si utilizza (il mio preferito) bash, >e >>sono molto più bello / più facile.

L'uso teeconsente anche di sudo SOLO quel comando in modo da non dover eseguire sudo l'intera istruzione, come in sudo sh -c "echo foo > bar". teeconsente anche di dividere l'output. Ovviamente, tutto questo può essere visto in man tee. È principalmente solo la tua preferenza personale.

Per ulteriori letture, vedere qui e qui .


5
Chiarimento su "sudo SOLO quel comando", per chiunque lo trovi un po 'complesso: usando un form come sudo somecommand >> fileaverrà eseguito sudo somecommande quindi, come utente invocatore , aggiungere l'output a filea. L'utilizzo di sudo sh -c "somecommand >> filea"opere, ma può causare incubi tra virgolette. L'uso somecommand | sudo tee -a fileaviene eseguito somecommandcome utente invocante e quindi aggiunge l'output a filearoot, che di solito è ciò che l'utente voleva.
Darael,

@Darael ho modificato il post. Grazie per aver chiarito.
Kaz Wolfe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.