2009-03-04 3 views
-3

Я пробовал с множеством разных примеров, но он не работает.Нужен образец кода Java для запуска shellscript

Я бы очень признателен за образец Java-кода для запуска сценария оболочки.

+0

???? можете ли вы быть более явным? – chburd

+0

Немного больше контекста было бы хорошо, да. – extraneon

ответ

4

Вам необходимо Runtime.getRuntime(). Exec (...). См. a very extensive example (не забудьте прочитать первые три страницы).

Имейте в виду, что Runtime.exec является не оболочкой; если вы хотите выполнить скрипт, командная строка будет выглядеть

/bin/bash scriptname 

То есть, оболочка двоичные вам нужно полностью квалифицирован (хотя я подозреваю, что/бен всегда в пути). Вы не можете предположить, что если

myshell> foo.sh 

работает,

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

также работает, как вы уже в запущенной оболочке в первом примере, но не в Runtime.exec.

Испытуемый пример (работает на моем Linux Machine (TM)), mosly вырезать и прошлом из the previously mentioned article:

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

Shell Script код 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(); 
     } 
Смежные вопросы