I have explored almost all available similar questions, to no avail.
Let me describe the problem in detail:
I run some unattended scripts and these can produce standard output and standard error lines, I want to capture them in their precise order as displayed by a terminal emulator and then add a prefix like "STDERR: " and "STDOUT: " to them.
I have tried using pipes and even epoll-based approach on them, to no avail. I think solution is in pty usage, although I am no master at that. I have also peeked into the source code of Gnome's VTE, but that has not been much productive.
Ideally I would use Go instead of Bash to accomplish this, but I have not been able to. Seems like pipes automatically forbid keeping a correct lines order because of buffering.
Has somebody been able to do something similar? Or it is just impossible? I think that if a terminal emulator can do it, then it's not - maybe by creating a small C program handling the PTY(s) differently?
Ideally I would use asynchronous input to read these 2 streams (STDOUT and STDERR) and then re-print them second my needs, but order of input is crucial!
NOTE: I am aware of stderred but it does not work for me with Bash scripts and cannot be easily edited to add a prefix (since it basically wraps plenty of syscalls).
Update: added below two gists
(sub-second random delays can be added in the sample script I provided for a proof of consistent results)
Update: solution to this question would also solve this other question, as @Gilles pointed out. However I have come to the conclusion that it's not possible to do what asked here and there. When using 2>&1
both streams are correctly merged at the pty/pipe level, but to use the streams separately and in correct order one should indeed use the approach of stderred that involves syscall hooking and can be seen as dirty in many ways.
I will be eager to update this question if somebody can disprove the above.
2>&1
, for the purposes of this question-- in all those cases, the program's fds 1 and 2 refer to the same underlying thing (kernel resource), and that's when interleaving order is guaranteed to stay correct. As soon as the fds are redirected to different underlying things, the ordering is lost, in all of these cases. – Don Hatch Dec 27 '19 at 06:18