Möchten Sie diese Frage verbessern? Fügen Sie Details hinzu und klären Sie das Problem, indem Sie diesen Beitrag bearbeiten.
Vor 4 Jahren geschlossen.
Verbessern Sie diese Frage
Nachdem Sie auf etwa 3 tee
gestoßen sind Erklärungen, die ich für undidaktisch halte, würde ich um eine einfache, allgemeine und (wenn möglich) abgestufte 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 vermisse, was der Befehl tatsächlich mit diesem Inhalt macht und wann er nützlich ist.
Hier ist also meine Frage, in der Hoffnung, eine didaktische Erklärung zu finden, die Neulingen in einer klaren, abgestuften Weise serviert wird:
-
Wie funktioniert der Befehl entweder mit der Standardausgabe eines Befehls oder alternativ mit den Dateien selbst?
-
Warum ist es üblich,
tee
zu sagen liest die Standardeingabe? Ich meine, wenn ichls -l
mache ,tee
liest die Syntaxls -l
nicht selbst, sondern die stdout, die sie in die Sitzung ausgegeben hat.
Wenn Sie möchten, teilen Sie bitte auch ein praktisches Beispiel aus Ihrer täglichen Arbeit mit, wann tee
ist sehr nützlich für Sie?
Akzeptierte Antwort:
Vom tee
Handbuch auf meinem System:
Das Dienstprogramm tee kopiert die Standardeingabe in die Standardausgabe und erstellt eine Kopie
in null oder mehr Dateien. Die Ausgabe erfolgt ungepuffert.
Es liest also von der Standardeingabe und kopiert sie zur Standardausgabe und dupliziert dabei auch den Stream in eine oder mehrere Dateien.
In der folgenden Pipeline tee
würde die Ausgabe des ersten Befehls in der Pipeline nehmen und sie zur Standardausgabe (dem Terminal) kopieren, während sie auch Kopien davon in den Dateien one
erstellt , two
und three
:
$ somecommand | tee one two three
tee
hat viele Verwendungen, eine ist in Verbindung mit sudo
um die Ausgabe in eine Datei umzuleiten, die root gehört:
$ somecommand | sudo tee /root/somefile >/dev/null
Das Folgende würde nicht hat funktioniert, da die Umleitung als nicht privilegierter Benutzer erfolgt (es würde auch somecommand
ausführen als root, was unerwünscht sein kann):
$ sudo somecommand >/root/somefile
Ein künstliches Beispiel für das Anhängen eines festen Zeilensatzes an viele Dateien auf einmal (an alle Benutzer ~/.profile
Dateien, vorausgesetzt, dass der *
auf die Benutzernamen erweitert wird und dass die erweiterte Befehlszeile nicht zu lang für die Shell wird):
$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH
Ein echtes Beispiel für die Verwendung von tee
:
time doas box-build.sh 2>&1 | tee build.out | grep '^=*>'
Das bin ich, der das OpenBSD-Basissystem aufbaut. doas
ist das OpenBSD-„Äquivalent“ von sudo
und box-build.sh
ist ein kleines Shell-Skript, das das Erstellen übernimmt (im Wesentlichen cd /usr/src && make obj && make build
). Ich möchte die Ausgabe des gesamten Build-Prozesses speichern, einschließlich aller Fehler oder Warnungen, aber ich möchte nicht, dass alles in mein Terminal ausspuckt. Dazu verwende ich tee
um alles in build.out
zu speichern und dann grep
um nur einen Hinweis darauf zu bekommen, wo wir uns gerade im Terminal befinden.