Hat die Verwendung von tee eine Bedeutung?

47

Warum mögen fstabund /etc/apt/sources.list.d/<name>.listbeinhalten fast alle Anweisungen zum Anhängen von Text an Systemdateien die Verwendung tee und echo das Anhängen von besagtem Text?

Nehmen Sie die folgenden Beispiele, die als root ausgeführt werden :

## 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

Laufen diff -u file1 file2bringt nichts zurück; Laufen md5sum file1 file2zeigt, dass ihre Prüfsummen identisch sind, was mich zu meiner ursprünglichen Frage zurückbringt:

Warum ist das bei | tee <FILENAME>Ubuntu-Dokumenten so verbreitet, ist es nur eine gute Übung, sonst wäre es nicht einfacher, nur Beispiel 2 zu verwenden, anstatt die Ausgabe von an echozu übergeben tee?

Alexej Magura
quelle
1
Ihnen fehlt sudo in Ihren Befehlen; das zeigt unterschiedliche ergebnisse zwischen den 2;)
Rinzwind
1
@Rinzwind Ich führe diese Befehle als root aus.
Alexej Magura

Antworten:

83

Es gibt einen Unterschied: tee dupliziert die Ausgabe: Es sendet sie sowohl an die Datei als auch an die Anzeige.

Aber es gibt noch mehr:

  • Wenn Sie beispielsweise eine Zeichenfolge gleichzeitig in zwei Dateien schreiben möchten, können Sie den folgenden Befehl mit tee verwenden:

     echo "some text" | tee file1 > file2  
    
  • Eine andere Sache, die Ihnen helfen kann, ist die Vermeidung eines Problems bei der Verwendung von sudo. Der normale Ausgabeumleitungsoperator wird immer mit Ihren Benutzerrechten ausgeführt, auch wenn Sie ein sudo vor den Befehl schreiben, der den STDOUT-Text generiert. Mit anderen Worten, dies schlägt fehl, wenn Sie nicht berechtigt sind, in diese Datei zu schreiben:

     sudo echo "something" > bar  
    

    Aber mit Tee wird alles gut gehen:

    echo "something" | sudo tee bar  
    

2 Beispiele von dieser Seite . Es hat noch mehr.

Rinzwind
quelle
Sie können sudoohne tee- sudo sh -c 'echo SOMETHING > FILE'...;)
Wilf
7
@wilf ja, aber wenn Sie Anführungszeichen ausgeben müssen ", wird die Sache chaotisch
Braiam
3
Im ersten Fall, wenn Sie in N Dateien schreiben möchten, würde ich es vorziehen echo "some text" | tee file1 file2 ... fileNund vielleicht anhängen > /dev/null, wenn Sie keine Unordnung auf stdout wollen.
Elmar Zander
Nice one @ ElmarZander :)
Rinzwind
13

teeNimmt den Standardeingabestream und schreibt ihn sowohl in den Standardausgabestream als auch in einen Dateistream. Wenn es den Menschen hilft, sich zu erinnern, stammt der Befehlsname von einem T-Verteiler in der Rohrleitung. Es gibt einen schönen Wikipedia-Artikel, in dem ich über die Herkunft des Befehlsnamens informiert wurde.

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

user391339
quelle
11

Erstens teehängt er selbst keinen Text an und tut es auch nicht >.

Es ist tee -aund seine Ergänzung, >>dass ANHÄNGE Text.

Ich glaube nicht, dass alle Shells diese >>Funktion unterstützen. Deshalb teewird sie häufiger verwendet. (Denken Sie nur an einfach alt sh). Tee ist ein Befehl, während >>ein Operator ist.

Wenn Sie (mein persönlicher Favorit) verwenden bash, >und >>sind viel schöner / einfacher.

Mit teekönnen Sie auch JUST diesen Befehl sudo, so dass Sie nicht die gesamte Anweisung sudo, wie in sudo sh -c "echo foo > bar". teeAußerdem können Sie die Ausgabe aufteilen. Das alles kann man natürlich in sehen man tee. Es ist hauptsächlich nur Ihre persönliche Präferenz.

Weitere Informationen finden Sie hier und hier .

Kaz Wolfe
quelle
5
Erläuterung zu "sudo JUST that command" für alle, die dies als etwas komplex empfinden: Wenn Sie ein Formular wie sudo somecommand >> fileaausführen , fügen Sie sudo somecommandals aufrufender Benutzer die Ausgabe an filea. Die Verwendung von sudo sh -c "somecommand >> filea"Works kann jedoch Albträume verursachen, die sich auf verschachtelte Anführungszeichen beziehen. Mit somecommand | sudo tee -a filealäuft somecommandwie der aufrufende Benutzer, und fügt dann die Ausgabe fileaals root - die in der Regel ist das, was der Benutzer wollte.
Darael
@ Darael Ich habe den Beitrag bearbeitet. Vielen Dank für die Klarstellung.
Kaz Wolfe