阻止bash将stdin转发到stderr



我正在尝试使用bash的交互模式来实现一个简单的终端GUI。我成功地调用了bash,获得了它的stdout,并将所有内容打印到文本视图中。我将用户输入从文本视图转发到bash的stdin,以便能够运行命令。它工作得很好,只是我没有收到任何错误消息。

然而,当我将bash的stderr打印到我的文本视图时,我注意到了一些奇怪的东西。除了现在接收错误消息之外,bash似乎还传递从stdintderr的所有信息。因此,我键入的每个字符都会打印两次(一次通常是因为我输入了它,另一次是因为我打印了stderr中的所有内容)。

它似乎还通过stderr(bash-3.2$)打印提示。这是预期的行为吗?这能被抑制吗?

我还尝试只捕获use输入(而不让用户直接在文本视图中键入),并依靠bash来打印用户输入。这几乎是有效的,除了通过stdoutstderr的输出顺序是随机的:

如果我键入像echo test这样的命令并点击回车,有时我会得到这样的结果:
(第二个test是输出,我没有键入testtest)

bash-3.2$ echo testtest
bash-3.2$ 

有时我会得到:

bash-3.2$ echo test
bash-3.2$ test

我接收最后的n、输出和下一个bash-3.2$的顺序显然混淆了。

无法以"正确"的顺序读取stdout和stderr,因为不同管道之间没有顺序的概念。但是,您可以确保将两者都发送到同一个管道(即,相同的文件描述符),而不是将每个文件都发送到单独的管道。要做到这一点,请查看用于启动bash子流程的任何选项;或者可以启动类似CCD_ 7的命令行。

相关内容

  • 没有找到相关文章

最新更新