2012-03-29 76 views
6

javaのRuntimeクラスを使用してユーザー入力を待つ次のシェルスクリプトを実行する方法はありますか?Javaランタイムを使用して対話型シェルスクリプトを実行する方法は?

#!/bin/bash 

echo "Please enter your name:" 
read name 
echo "Welcome $name" 

このタスクを実行するには、次のJavaコードを使用していますが、空白のコンソールしか表示されません。私はプログラム上で実行するとき

public class TestShellScript { 
public static void main(String[] args) { 

     File wd = new File("/mnt/client/"); 
      System.out.println("Working Directory: " +wd); 
      Process proc = null; 

      try { 
       proc = Runtime.getRuntime().exec("sudo ./test.sh", null, wd); 

      } catch (Exception e) { 
      e.printStackTrace(); 
      } 


} 

}

事は、私はそれがシェルスクリプトを実行しますと考えられ、そのシェルスクリプトは、ユーザの入力を待ちますが、それは単に現在のディレクトリを印刷した後、終了します。これを行う方法はありますか、それともJavaではまったく可能ではありませんか?事前

+0

http://stackoverflow.com/questions/4784789/call-interactive:あなたは、Javaから外部スクリプトを実行するためにしている場合しかし、私は非常に強くコモンズExecのを見てすることをお勧めします-perl-script-from-java –

答えて

1

それは現在のディレクトリを印刷し、終了の理由で

おかげで、あなたのJavaアプリが終了するのであります。あなたは、あなたの作成したプロセスの入力およびエラーストリームに(ネジ付き)リスナーを追加する必要がある、とあなたはおそらく

例プロセスの出力ストリームにのPrintStreamを追加することをお勧めします:



      proc = Runtime.getRuntime().exec(cmds); 
      PrintStream pw = new PrintStream(proc.getOutputStream()); 
      FetcherListener fl = new FetcherListener() { 

       @Override 
       public void fetchedMore(byte[] buf, int start, int end) { 
        textOut.println(new String(buf, start, end - start)); 
       } 

       @Override 
       public void fetchedAll(byte[] buf) { 
       }   
      }; 
      IOUtils.loadDataASync(proc.getInputStream(), fl); 
      IOUtils.loadDataASync(proc.getErrorStream(), fl); 
      String home = System.getProperty("user.home"); 
      //System.out.println("home: " + home); 
      String profile = IOUtils.loadTextFile(new File(home + "/.profile")); 
      pw.println(profile); 
      pw.flush(); 

実行するにはこれには、私のsourceforgeプロジェクト:http://tus.sourceforge.net/をダウンロードする必要がありますが、うまくいけば、コードスニペットは、あなたがJ2SEなどを使用しているものに適応できるだけの十分な教訓です。

+0

Webページの例のコードやリンクを掲載して、例を詳しく説明してください。 –

+0

ここにいくつかのコードを示します: – ControlAltDel

+0

私は自分のコードでSVNからソースをダウンロードしようとしましたが、それは入力待ちですし、コンソールに入力することもできますが、その入力をシェルスクリプトやプログラムに渡すことはありません実行中。理想的には、名前シェルスクリプトを入力した後に動作する必要があります。名前を付けてプログラムを実行する必要があります。あなたがデータを得れば –

1

Java ProcessBuilderを使用する場合は、作成したプロセスの入力ストリーム、エラーストリーム、および出力ストリームを取得できるはずです。

これらのストリームは、プロンプト入力などのプロセスから出てくる情報を取得するために使用できますが、プロセスに情報を直接書き込むこともできます。たとえば:

InputStream stdout = process.getInputStream(); 
BufferedReader reader = new BufferedReader (new InputStreamReader(stdout)); 

String line; 
while(true){ 
    line = reader.readLine(); 
    //... 

これは、プロセスの出力を直接取得します。私は自分でそれをやったことはありませんが、私はかなり確信していますprocess.getOutputStream()は、プロセスに入力を送るために直接書くことができるものをあなたに与えます。

1

sudoなどの対話型プログラムを実行する際の問題は、Runtime.execからstdinとstdoutを必要なコンソールデバイスではなくパイプに接続することです。 redirecting the input and output to /dev/ttyで作業させることができます。

新しいProcessBuilderクラスを使用して同じ動作を実現し、ProcessBuilder.Redirect.INHERITを使用してリダイレクトを設定できます。

関連する問題