我正在写一个 terminal logging program - 想想 script
命令,但功能更强大。其中一个区别是,虽然 script
将 stdout、stdin 和 stderr 捕获为一个大字符流,但我想将它们分开并记录下来。
为了做到这一点,我使用了运行一个连接到 pty 的子 shell 的标准方法,但是我没有使用一个 pty 与 stdin、stdout 和 stderr 都连接到它,我使用了两个 ptys - stdin 和stderr 连接到一个 pty,stdout 连接到另一个 pty。这样,主进程就可以分辨出什么来自 stdout,什么来自 stderr。
到目前为止,这一切都很好。但是,我开始遇到一些问题。例如,当尝试设置列数时,我得到以下信息:
$stty cols 169
stty: stdout appears redirected, but stdin is the control descriptor
这似乎是 this piece of code 的结果,它似乎检查 stdout 和 stderr 是否都是 ttys,但如果它们不相同,则会提示。
因此,我的问题是:我是否以这种方式违反了关于 Posix 进程如何运行的任何基本假设?如果没有,知道为什么我会看到这样的错误吗?如果是这样,有什么方法可以解决这个问题,并且仍然设法很好地分离 stdout 和 stderr?
最佳答案
我对此的一个想法是直接在 pty 上使用一个进程,然后运行目标程序,例如
(wrapper) -> pty -> (controller) -> script
Controller 将负责运行脚本并分别捕获 stdout
和 stderr
,将它们反馈给包装器,可能是通过一些非 std fd,或者或者,在将数据运回之前序列化数据,例如为 stderr
的输出加上 stderr:
和 stdout
的前缀 stdout:
- 然后在包装器中反序列化它并提供它返回上游或任何你想用它做的事。
关于linux - 连接到单独 pty 的进程用于 stdout 和 stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21778850/