让我详细描述问题:
我运行一些无人值守的脚本,这些脚本可以产生标准输出和标准错误行,我想捕获它们 按终端仿真器显示的精确顺序,然后向它们添加诸如“ STDERR:”和“ STDOUT:”的前缀。
我尝试对它们使用管道,甚至基于epoll的方法,都无济于事。我认为解决方案是使用pty,尽管我对此并不熟练。我也偷看了Gnome VTE的源代码,但是效率不高。
理想情况下,我会使用Go而不是Bash来完成此操作,但我一直无法做到。似乎管道由于缓冲会自动禁止保持正确的行顺序。
有人能够做类似的事情吗?还是不可能?我认为,如果终端仿真器可以做到这一点,那不是-可能是通过创建一个以不同方式处理PTY的小型C程序吗?
理想情况下,我将使用异步输入读取这两个流(STDOUT和STDERR),然后根据需要重新打印它们,但是输入顺序至关重要!
注意:我知道stderred,但是它不适用于Bash脚本,并且不能轻易地添加前缀(因为它基本上包装了许多syscall)。
更新:添加以下两个要点
(可以在我提供的示例脚本中添加亚秒级随机延迟以证明结果一致)
更新:正如@Gilles指出的那样,该问题的解决方案也将解决其他问题。但是我得出的结论是,不可能在这里和那里做所要求的事情。当使用2>&1
这两种流时,应该在pty / pipe级别正确合并,但是要分别并以正确的顺序使用流,实际上应该使用stderred的方法,即involes syscall挂钩,并且在许多方面都可以视为脏污。
如果有人可以反驳以上内容,我将急于更新此问题。