Ich möchte die Standardausgabe eines Programms weiterleiten, während ich es auf dem Bildschirm halte.
Mit einem einfachen Beispiel ( echo
hier nur zur Veranschaulichung):
$ echo 'ee' | foo
ee
<- die Ausgabe, die ich sehen möchte
Ich weiß, dass tee stdout in eine Datei kopieren kann, aber das ist nicht das, was ich will.
$ echo 'ee' | tee output.txt | foo
Ich habe es versucht,
$ echo 'ee' | tee /dev/stdout | foo
aber es funktioniert nicht, da die Tee-Ausgabe an weitergeleitet /dev/stdout
wirdfoo
echo 'ee' | tee /dev/stderr
funktioniert. Wenn also stderr auch Ihre Anforderung "auf dem Bildschirm" erfüllt, reicht dies aus.Antworten:
Hier ist eine Lösung, die auf jeder Unix / Linux-Implementierung funktioniert, vorausgesetzt, sie muss dem
POSIX
Standard folgen . Es funktioniert auch in einigen Nicht-Unix-Umgebungencygwin
.Referenz: Die Open Group Base-Spezifikationen Ausgabe 7 IEEE Std 1003.1, Ausgabe 2013, §10.1 :
Es wurde berichtet, dass einige Umgebungen wie Google Colab nicht implementiert werden,
/dev/tty
während dertty
Befehl weiterhin ein verwendbares Gerät zurückgibt. Hier ist eine Problemumgehung:oder mit einer alten Bourne-Muschel:
quelle
/dev/tty
ist ein obligatorisches Unix-Gerät. Laufen Sie in einem BSD-Gefängnis?tee
wie folgt kaskadieren :cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.log
1) alles an die Konsole senden, 2) alles an eine andere Datei anhängen, 3) diefoo
Zeilen an eine andere Datei senden./dev/tty
, aber die Ausgabe vontty
ist verwendbar.Eine andere Sache zu versuchen ist:
Das
>(foo)
ist eine Prozesssubstitution .quelle
foo
Teil der Prozessersetzung sein muss. Hier ist ein Beispiel:echo 'ee' | tee file.txt >(wc -c | tr -d ' ')
echo 'ee' | tee >(cat) | foo | bar
.Der Zugriff auf "/ dev / stdout" wird auf einigen Systemen verweigert, der Zugriff auf das Benutzerterminal wird jedoch durch "/ dev / tty" gewährt. Unter Verwendung von "wc" für "foo" funktionieren die obigen Beispiele (unter Linux, OSX usw.) wie folgt:
Um eine Anzahl am Ende einer Liste übereinstimmender Dateien hinzuzufügen, verwende ich Folgendes:
% ls [A-J]* | tee /dev/tty | wc -l
Um zu vermeiden, dass ich mich an all das erinnern muss, definiere ich Aliase:
% alias t tee /dev/tty
% alias wcl wc -l
damit ich einfach sagen kann:
% ls [A-J]* | t | wcl
quelle
Versuchen:
Wenn die Verwendung von stderr natürlich eine Option ist.
quelle
Zuerst müssen Sie das Terminal herausfinden, das Ihrem Bildschirm zugeordnet ist (oder auf welchem Bildschirm die Ausgabe angezeigt werden soll):
dann können Sie die Ausgabe an dieses Terminal senden und die andere Kopie durch Ihr foo-Programm leiten:
quelle
t
nutzlos. Sie können verwenden,echo ee | tee $(tty) | foo
aber es hat immer noch einen nutzlosen Befehl (tty
), da die Tatsache/dev/tty
nur funktioniert.