サブプロセスとして対話モードでsh
を実行するJavaプログラムがあります。入力はSystem.in
からコピーされ、出力はSystem.out
にコピーされます。例えば、出力が間違った順序で表示されます。この対話型シェルのコマンドなどpwd
を実行するときにすべてがそれを除いて正常に動作します:サブプロセスの出力が間違った順序で表示されるのはなぜですか?
$ pwd
$ /home/viz/workspace
代わり
$ pwd
/home/viz/workspace
$
違いであるという最初のケースでpwd
の出力の前にプロンプト$
が出力されます。
なぜそれが起こりますか、それを修正する方法はありますか?標準エラーと標準出力が非同期に読み出したデータを印刷する別のスレッドに行くので
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
class StreamCopier implements Runnable {
private InputStream in;
private OutputStream out;
public StreamCopier(InputStream in, OutputStream out) {
this.in = in;
this.out = out;
}
public void run() {
try {
int n;
byte[] buffer = new byte[4096];
while ((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
out.flush();
}
out.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
public class Test {
public static void main(String[] args)
throws IOException, InterruptedException {
Process process = Runtime.getRuntime().exec("sh -i +m");
Thread outThread = new Thread(new StreamCopier(
process.getInputStream(), System.out));
outThread.start();
Thread errThread = new Thread(new StreamCopier(
process.getErrorStream(), System.err));
errThread.start();
Thread inThread = new Thread(new StreamCopier(
System.in, process.getOutputStream()));
inThread.start();
process.waitFor();
outThread.join();
errThread.join();
inThread.join();
}
}
あなたが別のシェルを実行した場合はどうなりますか? – dacwe
@dacwe:これまでのところshの作業しかできませんでした。試してみたが、IOをやろうとすると止められた。おそらく他のオプションが必要になるでしょう( '+ m'は助けになりません)。 – vitaut