0

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

但是,当我继续将 bash 的stderr打印到我的文本视图时,我注意到了一些奇怪的事情。除了现在接收错误消息之外,bash 似乎将所有内容从stdin传递到stderr。因此,我输入的每个字符都会打印两次(通常一次是因为我输入了它,一次是因为我从stderr打印了所有内容)。

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

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

如果我输入一个类似的命令echo test并按回车,有时我会得到这个:(
第二个test是输出,我没有输入testtest

bash-3.2$ echo testtest
bash-3.2$ 

有时我会得到:

bash-3.2$ echo test
bash-3.2$ test

我收到 final \n、 output 和 next的顺序bash-3.2$显然是混淆了。

4

1 回答 1

2

无法以“正确”顺序读取 stdout 和 stderr,因为不同管道之间没有顺序概念。但是您可以确保将两者都发送到同一个管道(即同一个文件描述符),而不是让每个都发送到单独的管道。为此,请查看用于启动 bash 子进程的任何选项;或者可能启动一个命令行,例如bash -c 'bash 2>&1'.

于 2012-12-07T00:49:15.827 回答