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 用です。なんとか作成できたらすぐに、最小限のコード例を投稿しようと思います。