1

Java で端末エミュレータを実装しようとしています。Windows 上の cmd.exe と Unix ライクなシステム上の bash の両方をホストできるはずです (少なくとも Linux と Mac OS X をサポートしたいと思います)。私が抱えている問題は、標準入力に送信したものは何でも標準出力cmd.exeで繰り返すことです。bash

たとえば、bash では、" ls" と入力して Enter キーを押すと、ターミナル エミュレータが入力行を bash の stdin に送信し、ストリームをフラッシュします。次に、プロセスは再び入力行を出力し、ls\n次にコマンドの出力を出力しますls

bashこれは問題です。なぜなら、 and以外の他のプログラムはそれをcmd.exe行わないからです。bash またはcmd.exeのいずれかでコマンド " python -i" を実行すると、python インタラクティブ シェルは途中bashで入力を繰り返さず、cmd.exe実行します。これは、回避策として、実際の出力がどのプロセスから来たのかを知る必要があることを意味します。それが実際の端末エミュレーターが行うことだとは思えません。

" " を実行bash -iしても、この動作は変わりません。私の知る限り、cmd.exe明確な「インタラクティブ」モードと「非インタラクティブ」モードはありません。


編集:ProcessBuilderクラスを使用してホスト プロセスを作成しています。ストリーム gobblerと同様の手法を使用して、stdout と stderr を読み取り、プロセスの stdin に書き込みます。ホスト プロセスを開始する前に、環境変数を設定しません。プロセスを開始するために使用する正確なコマンドはbash -i、bashcmd用と cmd.exe 用です。なんとか作成できたらすぐに、最小限のコード例を投稿しようと思います。

4

1 に答える 1

4

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

あなたの場合、BASH は何らかの形で疑似 TTY を割り当てる必要があります。そうしないと、すべてのコマンドがエコーされません。set +x同様の効果がありますが、出力では+ lsなく表示lsされます。

cmd.exeコマンド@ECHO OFFを使用すると、同じ効果が得られるはずです。

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

于 2012-01-13T14:00:52.883 に答える