我正在尝试使用bash的交互模式实现一个简单的终端GUI。我成功调用了bash,得到了 stdout 并将所有内容打印到文本视图中。我将用户输入从文本视图转发到bash的 stdin ,以便能够运行命令。它工作得很好,除了我没有收到任何错误信息。
然而,当我继续将bash的 stderr 打印到我的文本视图时,我发现了一些奇怪的东西。除了现在收到错误消息之外,bash似乎传递了从 stdin 到 stderr 的所有内容。因此,我输入的每个字符都打印两次(一次正常,因为我输入它,一次因为我打印了来自 stderr 的所有内容)。
它似乎也通过 stderr (bash-3.2$
)打印提示。这是预期的行为吗?这可以被抑制吗?
我还试图捕获使用输入(而不是让用户直接输入文本视图)并依赖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$
的顺序显然已经混淆了。
答案 0 :(得分:2)
无法以“正确”顺序读取stdout和stderr,因为不同管道之间没有顺序概念。但是您可以确保将两者都发送到同一个管道(即相同的文件描述符),而不是让每个管道都转到一个单独的管道。要做到这一点,请查看用于启动bash子进程的任何选项;或者可以启动bash -c 'bash 2>&1'
之类的命令行。