私は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対話シェルはbash
とcmd.exe
のように入力を繰り返さない。これは、回避策は、実際の出力がどのプロセスから来たのかを知る必要があることを意味します。私はそれが実際の端末エミュレータが何をするのか疑問に思う。
"bash -i
"を実行してもこの動作は変わりません。私が知る限り、cmd.exe
には、「対話型」と「非対話型」モードがありません。
EDIT:私はProcessBuilder
クラスを使用して、ホストプロセスを作成しています。私はstdoutとstderrを読んで、stream gobblerのようなテクニックを使ってプロセスの標準に書いています。私はホストプロセスを開始する前に環境変数を設定しません。私がプロセスを開始するのに使う正確なコマンドは、bashの場合はbash -i
、cmd.exeの場合はcmd
です。私が作成するとすぐに最小限のコード例を投稿しようとします。
これは 'bash'と関連しているようです:ユーザー入力を隠す。 http://www.tech-recipes.com/rx/278/hide-password-entry-in-bournebash-shell-script/これはどうやって移植可能かわかりません。 – Piskvor
これは面白いです、 'echo ls | bashはそんなことはしない。 –
実際、私はそれを私の端末エミュレータの中で実行しても、それはしません。私はそれが入力がパイプから来ていることを知っているbashと関係があると思います。 – Honza