Ich habe fast alle verfügbaren ähnlichen Fragen ohne Erfolg untersucht.
Lassen Sie mich das Problem im Detail beschreiben:
Ich führe einige unbeaufsichtigte Skripte aus und diese können Standardausgaben und Standardfehlerzeilen erzeugen. Ich möchte sie in der genauen Reihenfolge erfassen, die von einem Terminalemulator angezeigt wird, und ihnen dann ein Präfix wie "STDERR:" und "STDOUT:" hinzufügen.
Ich habe versucht, Pfeifen und sogar epollbasierte Ansätze zu verwenden, ohne Erfolg. Ich denke, die Lösung wird in kleinen Mengen verwendet, obwohl ich kein Meister darin bin. Ich habe auch einen Blick in den Quellcode von Gnomes VTE geworfen , aber das war nicht sehr produktiv.
Idealerweise würde ich Go anstelle von Bash verwenden, um dies zu erreichen, aber ich war nicht in der Lage, dies zu tun. Scheint, als ob Pipes aufgrund der Pufferung automatisch die Einhaltung einer korrekten Zeilenreihenfolge verbieten.
Hat jemand etwas Ähnliches tun können? Oder ist es einfach unmöglich? Ich denke, wenn ein Terminal-Emulator das kann, dann nicht - vielleicht indem Sie ein kleines C-Programm erstellen, das die PTYs anders behandelt?
Idealerweise würde ich asynchrone Eingaben verwenden, um diese 2 Streams (STDOUT und STDERR) zu lesen und sie dann nach Bedarf erneut auszudrucken, aber die Reihenfolge der Eingaben ist entscheidend!
ANMERKUNG: Ich kenne stderred, aber es funktioniert nicht mit Bash-Skripten und kann nicht einfach bearbeitet werden, um ein Präfix hinzuzufügen (da es im Grunde viele Syscalls umschließt).
Update: unten zwei Gists hinzugefügt
(Zufällige Verzögerungen von weniger als einer Sekunde können in dem von mir bereitgestellten Beispielskript hinzugefügt werden, um ein konsistentes Ergebnis zu beweisen.)
Update: Die Lösung dieser Frage würde auch diese andere Frage lösen , wie @Gilles hervorhob. Ich bin jedoch zu dem Schluss gekommen, dass es nicht möglich ist, das zu tun, was hier und da gefragt wurde. Bei der Verwendung 2>&1
beiden Ströme sind korrekt am pty / Rohr Ebene verschmolzen, sondern die Ströme getrennt und in der richtigen Reihenfolge sollte man den Ansatz in der Tat zu verwenden , verwendet stderred dass involes syscall Einhaken und wie zu sehen sind schmutzig in vielerlei Hinsicht.
Ich werde diese Frage gerne aktualisieren, wenn jemand das oben Gesagte widerlegen kann.