1

我正在尝试用 Java 实现终端仿真器。它应该能够在 Windows 上托管 cmd.exe 并在类 Unix 系统上托管 bash(我希望至少支持 Linux 和 Mac OS X)。我遇到的问题是,无论我发送到他们的标准输入,两者都会在他们的标准输出上重复cmd.exebash

例如,在 bash 中,我键入“ ls”,然后按 enter,此时终端仿真器将输入行发送到 bash 的标准输入并刷新流。然后该过程再次输出输入行“ ls\n”,然后是ls命令的输出。

这是一个问题,因为除此之外的其他程序bashcmd.exe没有这样做。如果我在 bash 或cmd.exe命令“ python -i”中运行,python 交互式 shell 不会以这种方式重复输入,而是bash会这样做cmd.exe。这意味着解决方法必须知道实际输出来自哪个进程。我怀疑这就是实际的终端仿真器所做的。

运行 " bash -i" 不会改变这种行为。据我所知,cmd.exe没有明显的“交互”和“非交互”模式。


编辑:我正在使用ProcessBuilder该类创建主机进程。我正在读取 stdout 和 stderr 并使用类似于流 gobbler的技术写入进程的 stdin 。在启动主机进程之前,我没有设置任何环境变量。我用来启动进程的确切命令是bash -i用于 bash 和cmdcmd.exe。一旦我设法创建一个,我将尝试发布最小的代码示例。

4

1 回答 1

4

在 Unix 上,运行stty -echo以禁用“本地回显”(即 shell 重复您键入的所有内容)。这通常是启用的,因此用户可以编辑她键入的内容。

在你的情况下, BASH 必须以某种方式分配一个伪 TTY;否则,它不会回显每个命令。set +x会产生类似的效果,但是您会看到+ ls而不是ls在输出中。

cmd.exe命令@ECHO OFF应该可以达到同样的效果。

只需在创建流程后执行它们,它应该可以工作。

于 2012-01-13T14:00:52.883 回答