2017-03-21 22 views
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プログラムから開始することです。

+0

bashはその接続された端末からではなく、標準入力から読んでいるので、あなたのProcessBuilderをセットアップはオーケー –

+0

@AndrewMcGuinnessを支援されていません。私はこれを働かせることができる方法はありますか? Javaではなく、端末に接続されている 'bash'プロセスであることを指定できますか? – fergusq

答えて

0

ProcessBuilderの方法inheritIOがしたいようです。

ProcessBuilder b = new ProcessBuilder(args); 
b.inheritIO(); 
Process p = b.start(); 
関連する問題