2015-12-10 2 views
4

Я хочу, чтобы моя программа Java выполняла скрипт bash и возвращала результат обратно на Java. Трюк заключается в том, что мой скрипт запускает какой-то «интерактивный сеанс», и я полагаю, поэтому мое приложение Java зависает (вводит бесконечный цикл, я полагаю). Вот код, который я использую для выполнения сценария, для этого я использую ProcessBuilder. Я также пробовалКак выполнить скрипт bash из java-программы

Runtime.getRuntime().exec(PathToScript); 

Он также не работает.

public class test1 { 
public static void main(String a[]) throws InterruptedException, IOException { 

    List<String> commands = new ArrayList<String>(); 
    List<String> commands1 = new ArrayList<String>(); 

    commands.add("/Path/To/Script/skrypt3.sh"); 
    commands.add("> /dev/ttys002"); 



    ProcessBuilder pb = new ProcessBuilder(commands); 
    pb.redirectErrorStream(true); 
    try { 

     Process prs = pb.start(); 
     Thread inThread = new Thread(new In(prs.getInputStream())); 
     inThread.start(); 
     Thread.sleep(1000); 
     OutputStream writeTo = prs.getOutputStream(); 
     writeTo.write("oops\n".getBytes()); 
     writeTo.flush(); 
     writeTo.close(); 

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

    } 
} 
} 

class In implements Runnable { 

private InputStream is; 

public In(InputStream is) { 
    this.is = is; 
} 

@Override 
public void run() { 
    try { 
     byte[] b = new byte[1024]; 
     int size = 0; 
     while ((size = is.read(b)) != -1) { 



      System.out.println(new String(b)); 
     } 
     is.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(In.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 
} 

И вот сценарий, который я пытаюсь выполнить. Он работает как шарм, когда я запускаю его непосредственно с терминала.

#!/bin/bash   
drozer console connect <<EOF> /dev/ttys002 
permissions 
run app.package.info -a com.mwr.example.sieve 
exit 
EOF 
+0

Вы пытались добавить 'bash' или'/bin/bash' перед файлом сценария (либо в ProcessBuilder, либо в Runtime)? – fedterzi

+1

Я просто пробовал, без результатов. Проблема заключается в том, что он выдает исключение «команда не найдена». Я знаю, что это мои пользовательские команды, но почему Java должен обрабатывать каждую команду, которая находится в скрипте. Давайте просто запустим это в терминале. Есть ли способ сделать это? – DanoPlurana

ответ

1

Вы не должны пытаться добавить перенаправлять инструкции как часть имени команды:

commands.add("/Path/To/Script/skrypt3.sh"); 
commands.add("> /dev/ttys002"); 
ProcessBuilder pb = new ProcessBuilder(commands); 

Вместо этого используйте метод redirectOutput, что-то вроде этого:

tty = new File("/dev/ttys002"); 
ProcessBuilder pb = new ProcessBuilder("/Path/To/Script/skrypt3.sh") 
    .redirectOutput(ProcessBuilder.Redirect.appendTo(tty)) 
    .redirectError(ProcessBuilder.Redirect.appendTo(tty)) 
    .start(); 

Хотя, похоже, ваш скрипт bash уже обрабатывает перенаправление, поэтому не уверен, что вам нужно сделать это на Java.

См. this answer для получения дополнительной информации.

Смежные вопросы