Передача аргументов из Java-программы в bash-скрипт, вызывающий другую Java-программу с аргументами - PullRequest
1 голос
/ 19 ноября 2010

Я хочу выполнить сценарий оболочки в моей java-программе, передав аргумент, показанный ниже:

Runtime.getRuntime().exec("./test.sh " + "\\\"param1\\\"\\\"param2\\\"\\\"param3\\\"");

И test.sh вызовет другую java-программу, передающую строковый аргумент, например:

another.jar \"param1\"\"param2\"\"param3\"

и, наконец, программа anther.jar будет интерпретировать аргумент в этом формате

another.jar "param1""param2""param3"

Я немного запутался с этой причиной, поскольку в этой ситуации я не могу правильно обработать символы экранирования..kkk

В первой команде я попробовал несколько форматов строк, но не получил правильную форму.

Некоторая помощь подойдет!

Спасибо!

Ответы [ 2 ]

5 голосов
/ 19 ноября 2010

Использование ProcessBuilder . Ничего особенного не нужно делать с параметрами, они просто просочатся.

//ProcessBuilder pb = new ProcessBuilder("test.sh", "param1", "param2", "param3");
ProcessBuilder pb = new ProcessBuilder("test.sh", "param1 " + "param2 " + "param3");
pb.start();

В тесте .sh:

java -jar program2 $1 # Or however you want to call it.

В программе2.java

public static void main(String[] args)
{
   System.out.println(args[0]);
}
3 голосов
/ 19 ноября 2010

Я думаю, вам лучше использовать exec (String [] cmdarray) вместо exec (String cmd) . Это связано с тем, что exec (String cmd) маркирует аргументы с помощью StringTokenizer , который вообще не обращает внимания на двойные кавычки при разбиении аргументы командной строки.

Попробуйте что-то вроде этого:

ArrayList<String> argList = new ArrayList<String>();
argList.add("param1");
argList.add("param2");
argList.add("param2");
String[] args = argList.toArray(new String[argList.size()]);
Runtime.getRuntime().exec("mycommand", args);

Символы внутри значений параметров не должны заключаться в кавычки или экранирование, за исключением тех случаев, когда строковые литералы исходного кода Java могут требовать экранирования.

...