gpt4 book ai didi

objective-c - 防止 bash 将 stdin 转发到 stderr

转载 作者:行者123 更新时间:2023-11-30 14:22:26 28 4
gpt4 key购买 nike

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

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

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

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

如果我输入诸如 echo test 之类的命令并按 Enter 键,有时我会得到以下结果:
(第二个 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 子进程的任何选项;或者启动一个命令行,例如 bash -c 'bash 2>&1'

关于objective-c - 防止 bash 将 stdin 转发到 stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754884/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com