我正在尝试使用bash的交互模式来实现一个简单的终端GUI。我成功地调用了bash,获得了它的stdout,并将所有内容打印到文本视图中。我将用户输入从文本视图转发到bash的stdin,以便能够运行命令。它工作得很好,只是我没有收到任何错误消息。
然而,当我将bash的stderr打印到我的文本视图时,我注意到了一些奇怪的东西。除了现在接收错误消息之外,bash似乎还传递从stdin到tderr的所有信息。因此,我键入的每个字符都会打印两次(一次通常是因为我输入了它,另一次是因为我打印了stderr中的所有内容)。
它似乎还通过stderr(bash-3.2$
)打印提示。这是预期的行为吗?这能被抑制吗?
我还尝试只捕获use输入(而不让用户直接在文本视图中键入),并依靠bash来打印用户输入。这几乎是有效的,除了通过stdout和stderr的输出顺序是随机的:
如果我键入像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的命令行。