我正在尝试用 Java 实现终端仿真器。它应该能够在 Windows 上托管 cmd.exe 并在类 Unix 系统上托管 bash(我希望至少支持 Linux 和 Mac OS X)。我遇到的问题是,无论我发送到他们的标准输入,两者都会在他们的标准输出上重复cmd.exe
。bash
例如,在 bash 中,我键入“ ls
”,然后按 enter,此时终端仿真器将输入行发送到 bash 的标准输入并刷新流。然后该过程再次输出输入行“ ls\n
”,然后是ls
命令的输出。
这是一个问题,因为除此之外的其他程序bash
并cmd.exe
没有这样做。如果我在 bash 或cmd.exe
命令“ python -i
”中运行,python 交互式 shell 不会以这种方式重复输入,而是bash
会这样做cmd.exe
。这意味着解决方法必须知道实际输出来自哪个进程。我怀疑这就是实际的终端仿真器所做的。
运行 " bash -i
" 不会改变这种行为。据我所知,cmd.exe
没有明显的“交互”和“非交互”模式。
编辑:我正在使用ProcessBuilder
该类创建主机进程。我正在读取 stdout 和 stderr 并使用类似于流 gobbler的技术写入进程的 stdin 。在启动主机进程之前,我没有设置任何环境变量。我用来启动进程的确切命令是bash -i
用于 bash 和cmd
cmd.exe。一旦我设法创建一个,我将尝试发布最小的代码示例。