终端仿真器实现 - 重复输入的问题

时间:2012-01-13 12:19:09

标签: bash shell terminal cmd terminal-emulator

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

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

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

运行“bash -i”不会更改此行为。据我所知,cmd.exe没有明确的“互动”和“非交互”模式。


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

1 个答案:

答案 0 :(得分:4)

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

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

使用cmd.exe命令@ECHO OFF应达到同样的效果。

只需在创建过程后执行这些过程即可。