2012-01-13 18 views
1

私はJavaで端末エミュレータを実装しようとしています。 Windowsではcmd.exeを、UNIX系のシステムではbashをホストできるはずです(少なくともLinuxとMac OS Xをサポートしたいと思います)。私が持っている問題は、cmd.exebashの両方が、標準入力に送信したものであれば、それらの標準出力で繰り返すということです。端末エミュレータの実装 - 繰り返し入力の問題

たとえば、bashでは、「ls」と入力してEnterキーを押します。この時点で、端末エミュレータは入力行をbashの標準入力に送信し、ストリームをフラッシュします。プロセスは次に入力ラインを "ls\n"に出力し、次にlsコマンドの出力を出力します。

bashcmd.exe以外のプログラムではこれが行われないため、問題です。私が実行すると、いずれかのbash、またはcmd.exeのコマンド "python -i"を実行すると、python対話シェルはbashcmd.exeのように入力を繰り返さない。これは、回避策は、実際の出力がどのプロセスから来たのかを知る必要があることを意味します。私はそれが実際の端末エミュレータが何をするのか疑問に思う。

"bash -i"を実行してもこの動作は変わりません。私が知る限り、cmd.exeには、「対話型」と「非対話型」モードがありません。


EDIT:私はProcessBuilderクラスを使用して、ホストプロセスを作成しています。私はstdoutとstderrを読んで、stream gobblerのようなテクニックを使ってプロセスの標準に書いています。私はホストプロセスを開始する前に環境変数を設定しません。私がプロセスを開始するのに使う正確なコマンドは、bashの場合はbash -i、cmd.exeの場合はcmdです。私が作成するとすぐに最小限のコード例を投稿しようとします。

+0

これは 'bash'と関連しているようです:ユーザー入力を隠す。 http://www.tech-recipes.com/rx/278/hide-password-entry-in-bournebash-shell-script/これはどうやって移植可能かわかりません。 – Piskvor

+2

これは面白いです、 'echo ls | bashはそんなことはしない。 –

+0

実際、私はそれを私の端末エミュレータの中で実行しても、それはしません。私はそれが入力がパイプから来ていることを知っているbashと関係があると思います。 – Honza

答えて

4

Unixでは、「ローカルエコー」(つまり、入力したすべてのものを繰り返しているシェル)を無効にするには、stty -echoを実行します。これは、通常、ユーザーが入力した内容を編集できるように有効になっています。

あなたの場合、BASHは何とか擬似TTYを割り当てなければなりません。それ以外の場合は、すべてのコマンドをエコーし​​ません。 set +xも同様の効果がありますが、出力にlsではなく+ lsが表示されます。

cmd.exeとすると、コマンド@ECHO OFFと同じ効果が得られます。

プロセスが作成された後にそれらを実行するだけで動作するはずです。

関連する問題