Выполнитесь с параметрами

Я испытываю затруднения при выполнении пакетного файла в Java, который ожидает параметры. Эти параметры могут содержать пробелы, таким образом, я должен обернуть их в кавычки. Я должен буду также сделать то же самое для Linux, потому что некоторые параметры могут содержать специальные символы такой как !.

Нефункциональный код Windows:

ProcessBuilder pb = new ProcessBuilder(
        "cmd",
        "/c",
        "\"mybat.bat\"",
        "\"param 1\"",
        "\"param 2\"",
        "\"param 3\""
        );    

Нефункциональный код Linux:

ProcessBuilder pb = new ProcessBuilder(
        "bash",
        "-c",
        "'myshellscript.sh'",
        "'param 1'",
        "'param 2'",
        "'param 3'"
        ); 

Я понимаю, что должен добавлять параметры как пример Windows ниже, но это не будет работать с пробелами:

ProcessBuilder pb = new ProcessBuilder(
        "cmd",
        "/c",
        "mybat.bat param 1 param 2 param 3"
        );   

Как это должно быть сделано?

14
задан Dave Jarvis 27 January 2010 в 02:41
поделиться

2 ответа

Windows:

ProcessBuilder pb = new ProcessBuilder(
        "cmd", "/c", "mybat.bat", 
        "param 1", "param 2", "param 3");

UNIX:

ProcessBuilder pb = new ProcessBuilder(
        "sh", "mybat.sh", 
        "param 1", "param 2", "param 3");
17
ответ дан 1 December 2019 в 12:38
поделиться

Нет, вы должны , а не цитировать аргументы по *nix. Цитирование необходимо по *nix в интерактивной оболочке, чтобы не допустить их неправильного толкования оболочкой, но при прямом запуске процесса оболочка не задействована. Следовательно, нет необходимости цитировать.

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

Вы также не хотите, чтобы аргумент "-c" башировал. Это говорит ему о том, что нужно разобрать следующий аргумент в командной строке, но вы предоставляете список аргументов. Удалите опцию "-c" и лишние кавычки, и это должно сработать.

Надлежащим вызовом Linux было бы:

ProcessBuilder pb = new ProcessBuilder(
    "bash",
    "myshellscript.sh",
    "param 1",
    "param 2",
    "param 3"
    );

Также, если файл "myshellscript.sh" является исполняемым и имеет соответствующую строку shebang (например, "#!/bin/bash"), аргумент "bash" вам тоже не нужен. Это предпочтительнее, потому что если скрипт когда-либо будет заменен на скрипт, написанный на другом языке, вам не придется обновлять вызывающее приложение.

Аналогичным образом, в Windows вам не нужны аргументы "cmd" и "/c". Программа запуска процесса / OS должна автоматически обрабатывать запуск пакетного файла (на основе расширения).

5
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: