0
Javaアプリケーションからコマンドbash -i
を実行しようとしています。なぜなら、ユーザーはある作業の途中でシェルを使用してから、Javaアプリケーションに戻ることができるからです。すべてがうまく機能し、コンパイルした後JavaでProcessBuilderを使って `bash -i`を起動できないのはなぜですか?
import java.io.*;
public class exec {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder b = new ProcessBuilder(args);
b.redirectError(ProcessBuilder.Redirect.INHERIT);
Process p = b.start();
InputStream pout = p.getInputStream();
PrintWriter pin = new PrintWriter(p.getOutputStream());
Thread in = new Thread(() -> {
while (true) {
try {
int i = System.in.read();
if (i == -1) break;
pin.write(i);
pin.flush();
} catch (IOException e) {
e.printStackTrace();
break;
}
}
System.err.println("in finished");
});
Thread out = new Thread(() -> {
while (true) {
try {
int i = pout.read();
if (i == -1) break;
System.out.write(i);
} catch (IOException e) {
e.printStackTrace();
break;
}
}
System.err.println("out finished");
});
out.start();
in.start();
p.waitFor();
}
}
:
私はこのテストコードを持っています。私もbash
シェルを起動することができます:私はbash -i
シェルを起動しようとしているとき
$ java exec date
ti 21.3.2017 19.03.25 +0200
out finished
^C$ java exec bash
date
ti 21.3.2017 19.03.30 +0200
^Cout finished
はしかし、端子が奇妙な動作を開始します。
$ java exec bash -i
[1] + Stopped (tty input) java exec bash -i
$ [email protected]:/tmp$ fg
java exec bash -i
date
date
ti 21.3.2017 19.05.21 +0200
[email protected]:/tmp$ pwd
pwd
[1] + Stopped (tty input) java exec bash -i
Javaプロセスが停止し、シェルは再びsh
です、私は思います。 fg
の書き込み後、date
コマンドは一度しか動作しませんが、pwd
を試してもJavaは再び停止します。
私はこれを動作させる方法はありますか?私が望むのは、通常のインタラクティブなbashプロンプトをJavaプログラムから開始することです。
bashはその接続された端末からではなく、標準入力から読んでいるので、あなたのProcessBuilderをセットアップはオーケー –
@AndrewMcGuinnessを支援されていません。私はこれを働かせることができる方法はありますか? Javaではなく、端末に接続されている 'bash'プロセスであることを指定できますか? – fergusq