
Nachdem ich auf etwa drei Erklärungen gestoßen bin, tee
die 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:
Wie funktioniert der Befehl entweder mit der Standardausgabe eines Befehls oder alternativ mit den Dateien selbst?
Warum sagt man häufig, dass
tee
Standardeingaben gelesen werden? Ich meine, wenn ich das tuels -l
,tee
wird nicht die Syntaxls -l
selbst 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 tee
Ihnen sehr nützlich ist.
Antwort1
Aus dem tee
Handbuch 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 tee
wü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 one
und two
erstelle three
:
$ somecommand | tee one two three
tee
kann auf viele Arten verwendet werden, unter anderem in Verbindung mit sudo
der 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 somecommand
als 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 '^=*>'
doas
Hier baue ich das OpenBSD-Basissystem.das OpenBSD-"Äquivalent" vonsudo
und box-build.sh
ist 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 tee
alles in build.out
und grep
erhalte 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 sindT-ShirtEtikett.