Alle Gebräuche, die tee
ich jemals gesehen habe, waren solche:
do_something | tee -a logfile
Oder:
do_something_else | tee logfile
Ist tee
für diejenigen erfunden, die nicht wissen, dass Sie dasselbe mit Shell-Pipe-Umleitungen tun können? Sowie:
do_something >> logfile
Oder:
do_something_else > logfile
Es ist praktisch dasselbe und es sind weniger Tastaturtreffer erforderlich, um etwas einzugeben. In welchen versteckten Funktionen sehe ich nichts tee
?
tee
und der E / A-Umleitung ? Die Tatsache , dass es sagt , „Schale Rohr Umleitungen wie>
und>>
“ keinen Punkt zu seinen Gunsten, und ist ein Argument für so unklar schließen. Tatsächlich werden jedoch mehrere Fragen gestellt: "Wozutee
?", "Isttee
erfunden für diejenigen, die nicht wissen, dass Sie dasselbe mit Rohrumleitungen tun können?" Und "In welchen verborgenen Features sehe ich nichtstee
?". Mindestens zwei dieser Fragen sind zu weit gefasst.Antworten:
Was Sie nicht sehen, ist, dass
do_something | tee -a logfile
die Ausgabe inlogfile
und auf stdout gestellt wird, währenddo_something >> logfile
sie nur in die Protokolldatei gestellt wird.Der Zweck von
tee
ist, ein Szenario mit einem Eingang und mehreren Ausgängen zu erzeugen - genau wie bei einer T-Kreuzung.BEARBEITEN
Es gab Kommentare dazu, wie man
tee
scheinbar weniger Gebrauch machen kannsudo
. Dies ist neben dem Punkt:cat
,dd
oder vielleicht besserbuffer
bieten diese Möglichkeit mit einer besseren Leistung, wenn Sie die mehrere Ausgänge nicht brauchen. Verwenden Sietee
für das, was es entworfen ist, nicht für das, was es "auch kann"quelle
tee
kann sogar mehrere Argumente annehmen und gleichzeitig in viele Dateien schreiben.cat
auf unkomplizierte Weise anstelle vontee
zB verwendenecho /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern
?echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_pattern
funktioniert nicht, da die Weiterleitung von der Nicht-Sudo-Shell verarbeitet wird. Wasdd
,echo /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_pattern
funktioniert, aberdd
ist oft ein überwältigten Werkzeug, das großen Schaden zu tun, vor allem untersudo
. Wie fürbuffer
, es ist nicht standardmäßig in einem der RedHat- oder Ubuntu-basierten Distributionen installiert, die ich zur Hand haben muss (oder MacOS) ...cat
noch/bin/cat
die für mich. Es spielt keine Rolle, woher escat
kommt - das>
wird immer noch von der Top-Level-Shell (Nicht-Sudo) gehandhabt. Der Vorteil vontee
overcat
in dieser Situation ist, dass die Ausgabedatei als Befehlszeilenparameter (und nicht als Umleitung) übergeben werden kann.dd
sicherlich ist ein gangbarer Weg, obwohl ich immer noch bevorzugen würdetee
für diesencat
undtee
wie eingebaut? Und welche Version vonsudo
kann Shell-Builtins ausführen?Tee
ist nicht nutzlosVielleicht wusstest du das trotzdem? Wenn nicht, lesen Sie weiter! Oder wenn Sie wissen, wie es funktioniert, aber nicht sicher sind, warum es existiert, fahren Sie mit dem Ende fort, um zu sehen, wie es zur Unix-Philosophie passt.
Was ist der Zweck von
tee
?Im einfachsten Fall werden Daten über die Standardeingabe in die Standardausgabe und in eine (oder mehrere) Dateien geschrieben. Es wurde in der Art, wie es einen Eingang in zwei Ausgänge (und zwei Richtungen) aufteilt, mit einem Klempner-T-Stück verglichen .
Beispiele
Nehmen wir Ihr erstes Beispiel:
Dies übernimmt die Ausgabe von
do_something
und hängt sie an die Protokolldatei an, während sie auch dem Benutzer angezeigt wird. In der Tat hat die Wikipedia-Seitetee
dies als zweites Beispiel:Das nächste Beispiel hat eine andere Verwendung: Eskalation von Berechtigungen :
Oder möchten Sie die Ausgabe eines Befehls übernehmen, das irgendwo schreiben und das auch als Eingabe für einen anderen Befehl verwenden?
( Beispiele für die Verwendung von Tee-Befehlen )
Tee
arbeitet mit der Unix-Philosophie:(Verdienst der Grundlagen der Unix-Philosophie )
tee
passt zu all diesen:quelle
sudo tee -a
ist wahrscheinlich eine neuere Innovation (ich habe sie zum ersten Mal in Ubuntu-Handbüchern / Wikis gesehen, insbesondere zum Einrichten von Inhalten)/proc/sys
, da ich zu Ubuntu gewechselt habe, als ich zu einemsudo
basierten System gewechselt habe (wie Ubuntu standardmäßig konfiguriert ist), anstatt essu
mit einem zu verwenden root-Passwort). Ich denke schontee
vorsudo
, es ist also kein Grund fürtee
bestehende. Das brauchen Sie nichttee
, es ist einfach kürzer, interaktiv zu tippen alssudo sh -c 'cat > output'
.tee
zwei Pipelines speisen, wie zfoo | tee >(pipe2) | pipe1
. Oder ein anderer Spaß ist esffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.log
, Statuszeilenaktualisierungen interaktiv auf dem tty zu sehen, während "Zeilen" entfernt werden, die mit Wagenrücklauf anstelle von Zeilenvorschub für die eigentliche Protokollierung enden. (dh die Statuszeilenaktualisierungen herausfiltern). Im Allgemeinen können Sie einetee /dev/tty
beliebige Stelle in einer Pipeline als Debug-Ausdruck festlegen.>
und richtet die Umleitung ein, bevor sudo überhauptexec
'd bekommt. Es ist also definitiv keine Beschränkung von sudo, dass es nicht mit Dingen umgeht, die es nie sieht. :) Normalerweise versuche ich, dies als "Sudo-Workflow" oder einen ähnlichen Begriff zu bezeichnen, wenn ich es erkläre, anstatt Sudo selbst zu beschreiben.sudo tee -a
ist meiner Meinung nach ein Missbrauch von Tee. Verwendungsudo cat
,sudo dd
oder (mit der besten Leistung in vielen Fällen) ,sudo buffer
wenn Sie die mehrere Ausgänge nicht brauchen.Es ist überhaupt nicht dasselbe ...
Die folgenden scheinen etwas äquivalent zu sein, aber sie sind nicht:
Der entscheidende Unterschied besteht darin, dass der erstere die Daten nur in die genannte Datei geschrieben hat, während der letztere
hi
in das terminal (stdout
) und die genannte Datei geschrieben hat, wie unten gezeigt:tee
Mit dieser Option können Sie die Daten in eine Datei schreiben und in einer weiteren Pipeline verwenden. Auf diese Weise können Sie nützliche Aufgaben ausführen, z.Oder Sie können in eine Datei mit erhöhten Rechten schreiben, ohne der gesamten Pipeline erhöhte Rechte zu geben (hier
echo
wird als Benutzer ausgeführt, währendtee
in die Datei geschrieben wird alsroot
):Mit
tee
können Sie in viele Dateien ( undstdout
) schreiben :Es ist auch möglich,
exec
mittee
die gesamte Ausgabe eines Skripts in einer Datei aufzuzeichnen, während ein Beobachter (stdout
) weiterhin die Daten sehen kann:quelle
exec > >(tee "$LOGFILE") 2>&1
in einem Bash-Skript, bei dem das Skript stdout und stderr sowohl an stdout als auch an die Datei ausgibt, auf die von verwiesen wird$LOGFILE
.2>&1
, um Ausgabe und Fehler zu txt-Dateien in Windows fallen zu lassen.Das ist ein Tee:
Eine T-förmige Rohrverschraubung. Es hat einen Einlass und zwei separate Auslässe.
Mit anderen Worten, es teilt eine Pfeife in zwei; wie eine Weggabelung.
Ebenso
tee
ist eine Pipe (|
), mit der Sie Ihre Standardeingabe auf zwei separate Ausgaben umleiten können.Beispiel
Angenommen, Sie geben beispielsweise Folgendes ein
ls /
.Sie erhalten eine Ausgabe, die ungefähr so aussieht:
Leiten Sie die Ausgabe in eine Textdatei um,
ls / > ls.txt
und in der Shell wird nur in der resultierenden Textdatei keine Ausgabe angezeigt.Möchten Sie die Ausgabe anzeigen UND gleichzeitig an eine Textdatei übergeben?
Füge a
tee
zu deiner Pipe hinzu (|
) dh:ls / | tee ls.txt
Vergleichen Sie die beiden:
quelle
Nein. Sie erwähnen zufällig eines der wenigen Beispiele, in denen Sie mithilfe von
>
und>>
-Operatoren in die Datei umleiten können.Aber Tee kann noch viel mehr. Da Sie eine Pipe zu ihm erstellen, können Sie eine Pipe zu etwas anderem erstellen.
Ein gutes Beispiel finden Sie auf der Wikipedia-Seite :
Grundsätzlich können Sie eine Pipe an Tee senden, sodass Sie dann eine Pipe von Tee an etwas anderes senden können. Wenn Sie nur eine Protokolldatei schreiben möchten, brauchen Sie Tee nicht wirklich.
quelle
tee
ist alles andere als nutzlos. Ich benutze es die ganze Zeit und bin froh, dass es existiert. Es ist ein sehr nützliches Tool, wenn Sie eine Pipeline haben, die Sie aufteilen möchten. Ein sehr einfaches Beispiel ist, dass Sie ein Verzeichnis haben$d
, das Sie tarieren möchten, und dass Sie es auch hashen möchten, weil Sie paranoid sind (wie ich) und dem Speichermedium nicht vertrauen, um die Daten zuverlässig zu halten. Sie könnten es zuerst auf die Festplatte schreiben und dann hashen, aber das würde fehlschlagen, wenn das Archiv beschädigt wird, bevor es hasht. Außerdem müssten Sie es lesen, und wenn Sie mit Dateien arbeiten, die mehrere hundert GB groß sind, werden Sie wissen, dass Sie sie wirklich nicht noch einmal lesen möchten, wenn dies nicht der Fall sein muss.Also, was ich tue, ist einfach das:
Es erzeugt den Teerball und leitet ihn zum Tee, der ihn dann zu zwei Unterschalen leitet, von denen eine gehasht und die andere auf die Platte geschrieben ist.
Es ist auch großartig, wenn Sie mehrere Operationen an einer großen Datei ausführen möchten:
Liest die Datei einmal, hasht sie (damit Sie prüfen können, ob sie noch so ist, wie sie sein sollte), extrahiert sie und kopiert sie an einen anderen Speicherort. Es ist nicht nötig, es dreimal zu lesen.
quelle
tee
keine Subshells; die Aufruf - Shell läuftsha5sum
undcat
verbindet ihren Ausgang Deskriptoren Datei, die übergeben werdentee
. Auch eine nutzlose Verwendung voncat
; Sie können die Eingabeumleitung verwenden,tee
um direkt von zu lesenfile.tar.gz
.cat
ist Liebe.cat
ist Leben.< file.tar.gz tee >(sha256sum) ...
wenn Sie Bedenken hinsichtlich der lexikalischen Reihenfolge der Weiterleitungen haben. Das ändert nichts an der Tatsache, dass kein völlig separater Prozess erforderlich ist, um nur eine einzelne Datei zu fütterntee
.cat
ist relativ gering. Die Kosten für zusätzliche 100 GiB Write + Read-Systemaufrufe verschwenden definitiv zusätzliche CPU-Zeit und Speicherbandbreite für das vorgeschlagene Beispiel einer großen Datei. Denken Sie daran, dass die Speicherbandbreite eine gemeinsame Ressource für alle Kerne ist, ganz zu schweigen von der zusätzlichen Belastung des L3-Cache durch das Kopieren. Auf einem x86 mit aktivierter Spectre + Meltdown-Abschwächung sind Systemanrufe teurer als früher. Sie verbrauchen im Verlauf dieser Kopie eine messbare Menge an zusätzlicher CPU-Zeit. Auch>(cat > foo)
ist nicht einfacher zu verstehen alsfoo
, IMO.Nitpick on @ bertiebs Antwort lautet: Dieses Beispiel zeigt, wie tee verwendet wird, um eine inhärente Einschränkung des Befehls sudo zu umgehen. sudo kann die Standardausgabe nicht in eine Datei umleiten.
Es gibt keine inhärente Einschränkung, nur ein Missverständnis darüber, wie der Befehl verarbeitet wird.
Beispiel:
sudo echo 0 > /proc/sys/net/ipv4/ip_forward
Die aktuelle Shell analysiert die Befehlszeile. Es findet die Ausgabeumleitung und führt diese aus. Dann führt es den Befehl aus, der
sudo
die verbleibende Befehlszeile als Argumente für den ausgeführten Befehl enthält. Wenn die aktuelle Shell keine Root-Berechtigungen hat, schlägt die Ausgabeumleitung fehl.echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward
Dies funktioniert, weil die Ausgabeumleitung auf den
tee
Befehl verschoben wird , der zu diesem Zeitpunkt über Root-Berechtigungen verfügt, da er über ausgeführt wurdesudo
.sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"
Dies funktioniert, weil die Shell, die die Umleitung durchführt, über Root-Berechtigungen verfügt.
quelle
sudo
für den Befehl, aber nicht für die Datei, die ausgegeben wird, und die Umleitung funktioniert einwandfrei:sudo foo-needs-privilege > /tmp/this-output-file-doesnt
Wie bereits erwähnt,
tee
schreibt die Weiterleitung der Ausgabe an den Befehl diese Ausgabe sowohl in eine Datei als auch in stdout.Ich verwende diese
tee
Option häufig, wenn ich die Ausgabe eines Befehls erfassen möchte, dessen Ausführung lange dauert, und gleichzeitig die Ausgabe visuell überprüfen möchte, wenn der Befehl sie zur Verfügung stellt. Auf diese Weise muss ich nicht warten, bis der Befehl beendet ist, bevor ich die Ausgabe überprüfe.Was noch nicht erwähnt worden zu sein scheint (es sei denn, ich habe es übersehen), ist, dass der
tee
Befehl auch in mehrere Dateien gleichzeitig schreiben kann. Zum Beispiel:schreibt alle
*.png
Dateien im aktuellen Verzeichnis auf einmal in zwei verschiedene Dateien (a.txt
undb.txt
).Tatsächlich können Sie wie folgt Text in mehrere verschiedene Dateien gleichzeitig
tee
eingeben:quelle
Die häufigste Verwendung von tee besteht darin, den Text auf dem Terminal zu sehen, wenn Sie ihn an die Datei (oder die Dateien) senden. Der Wortlaut Ihrer Frage geht davon aus, dass Sie nur Text in Protokolldateien schreiben. Ich habe Skripte, die Listen von Dateinamen oder Verzeichnisnamen schreiben, um Dateien auszulösen (die von anderen Skripten asynchron verarbeitet werden), und ich benutze tee, um den gleichen Inhalt an stdout zu senden. Alle Standardausgaben werden an die Protokolle gesendet. Also habe ich meinen Text dort, wo ich ihn haben möchte, und ich habe einen Protokolleintrag, der aufzeichnet, dass ich dies getan habe, alles aus einer einzigen "Echo" -Anweisung
tee ist auch die beste Methode in Unix, um mehrere identische Dateien zu erstellen. Ich benutze es gelegentlich, um mehrere leere Dateien zu erstellen, so ...
quelle
touch
? (was passiert, ist sofort klarer)touch
Dateien nicht ab, wenn sie bereits vorhanden sind, sondern aktualisiert nur ihre Zeitstempel und lässt ihren Inhalt unverändert . abertee
wird sie abschneiden. Auchrm
+touch
ist etwas anderes alstee
(denken Sie an Hardlinks und Symlinks)truncate -s 0
? :-)Stellen Sie sich vor, Sie möchten die Ausgabe eines Befehls in eine Protokolldatei schreiben UND auf stdout drucken. Wenn Sie es zur gleichen Zeit tun müssen, dann brauchen Sie
tee
.Ein Anwendungsfall ist es, Build-Skripte zu haben, die den gesamten Build auf stdout schreiben (z. B. für Jenkins), aber wichtige Dinge gleichzeitig in eine separate Protokolldatei (für zusammenfassende E-Mails).
Sie werden wirklich vermisst,
tee
wenn Sie ein Skript in Windows ausführen müssen. Es gibt keinetee
und das ist echt nervig.quelle
tee
. Cmd war nie für ernsthaftes Scripting gedacht - dafür war VBS da. Powershell ist das neue Tool zum Erstellen von Skripten. Zugegeben, Cmd ist immer noch ziemlich mächtig, aber die Kommandozeilen-Tools sind ziemlich wenige.