I am trying to implement a terminal emulator in Java. It is supposed to be able to host both cmd.exe on Windows and bash on Unix-like systems (I would like to support at least Linux and Mac OS X). The problem I have is that both cmd.exe
and bash
repeat on their standard output whatever I send to their standard input.
For example, in bash, I type "ls
", hit enter, at which point the terminal emulator sends the input line to bash's stdin and flushes the stream. The process then outputs the input line again "ls\n
" and then the output of the ls
command.
This is a problem, because other programs apart from bash
and cmd.exe
don't do that. If I run, inside either bash, or cmd.exe
, the command "python -i
", the python interactive shell does not repeat the input in the way bash
and cmd.exe
does. This means a workaround would have to know what process the actual output came from. I doubt that's what actual terminal emulators do.
Running "bash -i
" doesn't change this behaviour. As far as I know, cmd.exe
doesn't have distinct "interactive" and "noninteractive" modes.
EDIT: I am creating the host process using the ProcessBuilder
class. I am reading the stdout and stderr and writing to the stdin of the process using a technique similar to the stream gobbler. I don't set any environment variables before I start the host process. The exact commands I use to start the processes are bash -i
for bash and cmd
for cmd.exe. I'll try to post minimal code example as soon as I manage to create one.
On Unix, run
stty -echo
to disable "local echo" (i.e. the shell repeating everything that you type). This is usually enabled so a user can edit what she types.In your case, BASH must somehow allocate a pseudo TTY; otherwise, it would not echo every command.
set +x
would have a similar effect but then, you'd see+ ls
instead ofls
in the output.With
cmd.exe
the command@ECHO OFF
should achieve the same effect.Just execute those after the process has been created and it should work.