2015-07-29 3 views
0

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

String cmd = "/opt/myScript \"/opt/myPath1\" \"/opt/myPath2 with spaces\""; 
Runtime rt = Runtime.getRuntime(); 
rt.exec(cmd); 

Я также попытался использовать ProcessBuilder класс вроде этого:

String myScript = "/opt/myScript"; 
String myArg1= "/opt/myPath1"; 
String myArg2 = "/opt/myPath2 with spaces"; 
ProcessBuilder pb = new ProcessBuilder(myScript , myArg1, myArg2); 
pb.start; 

Аргументы без пробелов принимаютс успешно, но я до сих пор есть проблемы со вторым ,

Я думал, что класс ProcessBuilder будет обрабатывать пробелы, но похоже, что я что-то пропустил.

Я не уверен, если это что-то делать, но только в том случае, вот мой сценарий:

#!/bin/bash 
PATH=$PATH:$1 
gnome-terminal --working-directory $2 

$1 и $2 аргументы, посланные из Java.

+1

Какая у вас проблема? Какие значения получает ваш скрипт с помощью «ProcessBuilder»? –

+0

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

+0

Возможно дубликат http://stackoverflow.com/questions/17141767/having-spaces-in-runtime -getruntime-exec-with-2-executables –

ответ

0

Runtime.exec() - перегруженный метод. Существует несколько возможных способов его вызова. Вызов exec(String command) выполняет указанную командную строку, но аргумент разделяется пробелами. Метод exec(String[] cmdarray) выполняет указанную команду и аргументы. Есть другие варианты exec() но лучше для вас

String cmd[] = new String[] {"/opt/myScript", "/opt/myPath1", "/opt/myPath2 with spaces" }; 
Runtime rt = Runtime.getRuntime(); 
rt.exec(cmd); 

Можно использовать ProcessBuilder можно также использовать для передачи аргументов. Я думаю, что единственной ошибкой является отсутствие скобок после pb.start.

И последнее, но не менее важное: сценарий имеет серьезную ошибку. Он не содержит quutes arround $2. Это должно быть

#!/bin/bash 
PATH="$PATH:$1" 
gnome-terminal --working-directory "$2"