【发布时间】:2014-03-13 18:49:03
【问题描述】:
我正在写一个terminal logging program - 想想script 命令,但它更有特色。不同之处之一是,虽然script 将标准输出、标准输入和标准错误捕获为一个大字符流,但我想将它们分开并记录下来。
为了做到这一点,我使用标准方法运行连接到 pty 的子 shell,但我没有使用单个 pty 与 stdin、stdout 和 stderr 都连接到它,而是使用两个 pty - 与 stdin 和stderr 连接到一个 pty,而 stdout 连接到另一个。这样,主进程就可以分辨出来自 stdout 和来自 stderr 的内容。
到目前为止,这一切都很好。但是,我开始遇到一些问题。例如,当尝试设置列数时,我得到以下信息:
$stty cols 169
stty: stdout 出现重定向,但 stdin 是控制描述符
这似乎是this piece of code的结果,它似乎检查stdout和stderr是否都是tty,但如果它们不一样就会抱怨。
因此,我的问题是:我是否违反了关于 Posix 进程如何以这种方式运行的任何基本假设?如果没有,知道为什么我会看到这样的错误吗?如果是这样,有什么办法可以解决这个问题,并且仍然可以很好地分离 stdout 和 stderr?
【问题讨论】:
-
是的,我认为这也是一个好主意。我可能会尝试一下,但我想我会放弃它 - 正如你所发现的那样太不标准了。这是我想出的(单个 pty)github.com/ioquatix/script-runner/blob/master/lib/…
-
我也在尝试做同样的事情,但由于这个问题没有任何运气。也许答案是使用具有相同文件描述符的两个管道生成进程,然后一旦它开始提供输出,就将 stderr 文件描述符更改为另一个 pty?
-
你们中的任何人都知道这个吗?