2013-12-05 2 views
1

Я новичок в программировании. Я создал список строк для ProcessBuilder. ProcessBuilder выполняет одну команду из списка String (и успешно записывает файл, который я попросил написать), но не выполняет следующую команду String. Вот код:ProcessBuilder выполняет одну команду из списка String, но не выполняет следующую команду.

List<String> vsArrays = new ArrayList<String>(); 
vsArrays.add("/bin/sh"); 
vsArrays.add("-c"); 
vsArrays.add("echo '123' > ~/1.rad"); 
vsArrays.add("echo '123' > ~/2.rad"); 
vsArrays.add("echo '123' > ~/3.rad"); 

for (String s : vsArrays){ 
system.out.println(s); 
} 

ProcessBuilder proc = new ProcessBuilder(vsArrays); 
Process start = proc.start(); 
start.waitFor(); 

Первый файл (с именем 1.rad) создается в домашнем каталоге (~), но следующие файлы не являются. Хотя мне удалось выполнить следующие команды (и записать другие файлы), используя redirectInput из файла, но я не хочу создавать отдельный файл для redirectInput. Можете ли вы ответить, почему следующие команды (из списка строк) не выполняются? Благодаря!

ответ

2

ProcessBuilder не предназначался для выполнения нескольких команд. Записи List рассматриваются как аргументы, и это вызванная программа sh, которая выполняет один аргумент из-за опции -c. Таким образом, это команда sh, и это опция -c, которая «решает» интерпретировать один аргумент и только один, как команду для запуска. Но bash будет запускать несколько команд, предоставляемых как один аргумент, разделенный ;.

List<String> vsArrays = new ArrayList<String>(); 
vsArrays.add("/bin/sh"); 
vsArrays.add("-c"); 
vsArrays.add("echo '123' > ~/1.rad; echo '123' > ~/2.rad; echo '123' > ~/3.rad"); 

ProcessBuilder proc = new ProcessBuilder(vsArrays); 
Process start = proc.start(); 
start.waitFor(); 
+0

Спасибо! Но ProcessBuilder выполняет несколько команд через redirectInput. Так будет ли какое-либо решение, если я изменил параметр «-c» для программы «sh» на какой-то другой вариант? Я посмотрел на руководство sh, но не смог найти подходящий вариант. – Vaib

+0

Возможно, вы прочитали ответ, когда я редактировал последнюю часть; существует упомянутое решение, вставляя несколько ';' -сепаратированных команд в один аргумент. – Holger

+0

Спасибо! Это сработало! У меня нет репутации для обновления вашего решения. Благодаря! – Vaib

0

Я не использовал процесс строитель на некоторое время, но я полагаю, вы передаете 4 последние строки в качестве аргументов в первой строке (исполняемый). В этом случае я не уверен, что команда, которую вы создали, имеет синтаксис. Попробуйте что-то вроде (не испытал сам код, но должен дать вам несколько идей):

private void myMainFunction() { 
    doWrite("1.rad"); 
    doWrite("2.rad"); 
    doWrite("3.rad"); 
} 

private void doWrite(String filename) { 
    List<String> vsArrays = new ArrayList<String>(); 
    vsArrays.add("/bin/sh"); 
    vsArrays.add("-c"); 
    vsArrays.add("echo '123' > ~/" + filename); 

    for (String s : vsArrays){ 
    system.out.println(s); 
    } 

    ProcessBuilder proc = new ProcessBuilder(vsArrays); 
    Process start = proc.start(); 
    start.waitFor(); 
} 
+0

Приятный трюк, это сработает. Спасибо! – Vaib

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