Angenommen, ich habe eine Binärdatei aufgerufen foo
.
Wenn ich die Ausgabe eines foo
anderen Prozesses umleiten möchte bar
, könnte ich schreiben ./foo | bar
.
Auf der anderen Seite wollte , wenn ich time
foo, und leiten Sie die Ausgabe von time
I, schreiben kann time (./foo) | bar
.
Meine Frage ist, wie kann ich die Ausgabe von time
an das Ende der Ausgabe von kleben foo
und durch dieselbe Pipe leiten ?
Die folgende Lösung ist nicht das, wonach ich suche, da sie zwei separate Instanzen des Prozesses startet bar
, während ich eine einzelne gemeinsame Pipe zu einer einzelnen Instanz von möchte bar
.
time (./foo | bar) | bar
Für alle, die neugierig sind, liegt der Grund dafür, dass sie nicht zwei Instanzen von starten möchten, bar
darin, dass bar
sie ein Netzwerkclient sein können, und ich möchte, dass die Zeitinformationen als Teil derselben http POST
Nachricht wie die Prozessausgabe an den Server gesendet werden.
quelle
Antworten:
Wenn ich verstehe, wonach du fragst, wird das reichen. Ich benutze die Befehle
ls ~
undtee
als Stellvertreter für./foo
undbar
, aber die allgemeine Form dessen, was Sie wollen, ist die folgende:HINWEIS: Die Ausgabe von
time
wird bereits am Ende einer Ausgabe von angehängt./foo
. Dies wird nur in STDERR durchgeführt. Um es durch die Pipe umzuleiten, müssen Sie STDERR mit STDOUT kombinieren. Sie können entweder|&
oder verwenden,2>&1
um dies zu tun.Beispiel
Und hier ist der Inhalt der Datei,
cmd.log
die von erstellt wurdetee
.quelle
time
Sendet seine Ausgabe standardmäßig an stderr anstelle von stdout. Sie müssen nur das umleiten, wo Sie es wollen.Sie sagen "Auf der anderen Seite, wenn ich
time
foo und die Ausgabe von umleiten wolltetime
könnte ich schreibentime (./foo) | bar
." aber das ist eigentlich falsch. In diesem Fall wird die Zeitausgabe weiterhin auf Ihrer Konsole angezeigt, und nur stdout wird umgeleitet.Sie können stderr gezielt umleiten mit:
oder alle Rohre mit:
Die Klammern werden benötigt, damit dies korrekt funktioniert.
quelle
Ich habe festgestellt, dass dies unter Solaris funktioniert.
(time ls) &> file
quelle