2009-03-04 18 views

答えて

4

Runtime.getRuntime()。exec(...)が必要です。 a very extensive exampleを参照してください(最初の3ページを読むことを忘れないでください)。

Runtime.execはで、シェルではないことに注意してください。;あなたはシェルスクリプトを実行したい場合(私は/ binがパスに常にあると思われるが)あなたのコマンドラインを使用すると、必要なシェルバイナリが完全修飾である、ある

/bin/bash scriptname 

ようになります。あなたは

myshell> foo.sh 

実行、

Runtime.getRuntime.exec("foo.sh"); 

もRuntime.execの中で、あなたが最初の例で実行しているシェルに既にあるとして動作しますが、ない場合と仮定することはできません。

Aはthe previously mentioned articleから例(私のLinuxマシン(TM)上で動作)、moslyカット・アンド・過去のテスト:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
public class ShellScriptExecutor { 

    static class StreamGobbler extends Thread { 
     InputStream is; 

     String type; 

     StreamGobbler(InputStream is, String type) { 
      this.is = is; 
      this.type = type; 
     } 

     public void run() { 
      try { 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       String line = null; 
       while ((line = br.readLine()) != null) 
        System.out.println(type + ">" + line); 
      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 
    } 


    public static void main(String[] args) { 
     if (args.length < 1) { 
      System.out.println("USAGE: java ShellScriptExecutor script"); 
      System.exit(1); 
     } 

     try { 
      String osName = System.getProperty("os.name"); 
      String[] cmd = new String[2]; 
      cmd[0] = "/bin/sh"; // should exist on all POSIX systems 
      cmd[1] = args[0]; 

      Runtime rt = Runtime.getRuntime(); 
      System.out.println("Execing " + cmd[0] + " " + cmd[1]); 
      Process proc = rt.exec(cmd); 
      // any error message? 
      StreamGobbler errorGobbler = new StreamGobbler(proc 
        .getErrorStream(), "ERROR"); 

      // any output? 
      StreamGobbler outputGobbler = new StreamGobbler(proc 
        .getInputStream(), "OUTPUT"); 

      // kick them off 
      errorGobbler.start(); 
      outputGobbler.start(); 

      // any error??? 
      int exitVal = proc.waitFor(); 
      System.out.println("ExitValue: " + exitVal); 
     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 
} 
+0

スクリプトが 'chmod + x'dで、最初の行が#!/ bin/shの場合、直接実行できます。 – vrdhn

+0

Runtime.exec()にもありますか?スクリプトの最初の行をチェックして#で始まるかどうかを調べるシェルだと思った。新しいことを学ぶのは常に素晴らしいことです。 – extraneon

3

シェルスクリプトtest.shコード

#!/bin/sh 
echo "good" 

Javaコードにシェルスクリプトtest.shを実行する

 try { 
      Runtime rt = Runtime.getRuntime(); 
      Process pr = rt.exec(new String[]{"/bin/sh", "./test.sh"}); 

      BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); 
      String line = ""; 
      while ((line = input.readLine()) != null) { 
       System.out.println(line); 
      } 
     } catch (Exception e) { 
      System.out.println(e.toString()); 
      e.printStackTrace(); 
     } 
関連する問題