Wie funktioniert der Tee-Befehl?

Wie funktioniert der Tee-Befehl?

Nachdem ich auf etwa drei Erklärungen gestoßen bin, teedie ich als undidaktisch erachte, würde ich um eine einfache, allgemeine und schrittweise (wenn möglich) Erklärung zu diesem Befehl bitten, die sich an Linux-Neulinge richtet.

Ich verstehe, dass wir es entweder über eine Pipe, auf der Standardausgabe eines Befehls oder alternativ direkt in einer bestimmten Datei verwenden, aber ich glaube, ich übersehe, was der Befehl tatsächlich mit diesem Inhalt macht und wann es nützlich ist.

Hier ist meine Frage, in der Hoffnung, eine didaktische Erklärung zu finden, die Neulingen klar und schrittweise vermittelt wird:

  1. Wie funktioniert der Befehl entweder mit der Standardausgabe eines Befehls oder alternativ mit den Dateien selbst?

  2. Warum sagt man häufig, dass teeStandardeingaben gelesen werden? Ich meine, wenn ich das tue ls -l, teewird nicht die Syntax ls -lselbst gelesen, sondern die Standardausgabe, die in der Sitzung gedruckt wurde.

Wenn Sie möchten, teilen Sie uns bitte auch ein praktisches Beispiel aus Ihrer täglichen Arbeit mit, das teeIhnen sehr nützlich ist.

Antwort1

Aus dem teeHandbuch zu meinem System:

Das Dienstprogramm tee kopiert die Standardeingabe in die Standardausgabe und erstellt eine Kopie in null oder mehr Dateien. Die Ausgabe ist ungepuffert.

Es liest also von der Standardeingabe und kopiert es in die Standardausgabe und dupliziert dabei auch den Stream in eine oder mehrere Dateien.

In der folgenden Pipeline teewürde ich die Ausgabe des ersten Befehls in der Pipeline nehmen und sie in die Standardausgabe (das Terminal) kopieren, während ich gleichzeitig Kopien davon in den Dateien oneund twoerstelle three:

$ somecommand | tee one two three

teekann auf viele Arten verwendet werden, unter anderem in Verbindung mit sudoder Umleitung der Ausgabe in eine Datei, die dem Root gehört:

$ somecommand | sudo tee /root/somefile >/dev/null

Folgendes würdenichthat funktioniert, da die Umleitung als nicht privilegierter Benutzer erfolgt (es würde auch somecommandals Root ausgeführt, was möglicherweise unerwünscht ist):

$ sudo somecommand >/root/somefile

Ein künstliches Beispiel für das Anhängen eines festen Zeilensatzes an viele Dateien gleichzeitig (an alle Benutzerdateien ~/.profile, vorausgesetzt, dass die *Erweiterung auf die Benutzernamen erfolgt und dass die erweiterte Befehlszeile für die Shell nicht zu lang wird):

$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH

Ein reales Anwendungsbeispiel tee:

time doas box-build.sh 2>&1 | tee build.out |  grep '^=*>'

doasHier baue ich das OpenBSD-Basissystem.das OpenBSD-"Äquivalent" vonsudound box-build.shist ein kleines Shell-Skript, das (im Wesentlichen cd /usr/src && make obj && make build) den Aufbau übernimmt. Ich möchte die Ausgabe des gesamten Erstellungsprozesses speichern, einschließlich aller Fehler oder Warnungen, aber ich möchte nicht, dass alles in mein Terminal ausgegeben wird. Zu diesem Zweck speichere ich teealles in build.outund greperhalte dann im Terminal nur einen Hinweis darauf, an welcher Stelle des Prozesses wir uns befinden.

Sehen Sie sich auch die anderen Fragen hier an, die mit dem Tag versehen sindEtikett.

verwandte Informationen