我正在尝试用Java实现终端模拟器。它应该能够在Windows上托管cmd.exe,在类Unix系统上托管bash(我想支持至少Linux和Mac OS X)。我遇到的问题是cmd.exe
和bash
重复标准输出,无论我发送到标准输入。
例如,在bash中,我输入“ls
”,按Enter键,此时终端模拟器将输入行发送到bash的stdin并刷新流。然后,该过程再次输出输入行“ls\n
”,然后输出ls
命令的输出。
这是一个问题,因为bash
和cmd.exe
之外的其他程序不会这样做。如果我在bash或cmd.exe
内运行命令“python -i
”,则python交互式shell不会以bash
和cmd.exe
的方式重复输入。这意味着解决方法必须知道实际输出来自哪个进程。我怀疑这是实际终端模拟器的作用。
运行“bash -i
”不会更改此行为。据我所知,cmd.exe
没有明确的“互动”和“非交互”模式。
编辑:我正在使用ProcessBuilder
类创建主机进程。我正在阅读stdout和stderr并使用类似于stream gobbler的技术写入流程的标准输入。在启动主机进程之前,我没有设置任何环境变量。我用于启动进程的确切命令是bash为bash -i
,cmd.exe为cmd
。一旦我设法创建一个代码,我就会尝试发布最小代码示例。
答案 0 :(得分:4)
在Unix上,运行stty -echo
以禁用“本地回显”(即shell重复您键入的所有内容)。这通常是启用的,因此用户可以编辑她键入的内容。
在你的情况下,BASH必须以某种方式分配一个伪TTY;否则,它不会回应每个命令。 set +x
会产生类似的效果但是,您会在输出中看到+ ls
而不是ls
。
使用cmd.exe
命令@ECHO OFF
应达到同样的效果。
只需在创建过程后执行这些过程即可。