Java ProcessBuilder для запуска нескольких команд последовательно в Linux
Я хотел бы выполнить 2 или более команды последовательно через мое приложение Java с помощью класса ProcessBuilder. Я попробовал несколько вариантов, как это было предложено в других ответах/форумах, но не повезло.
Вот что я пробовал:
ProcessBuilder processBuilder = new ProcessBuilder("ls", ";", "pwd");
Дает мне следующую ошибку:
Ошибки: ls:;: Нет такого файла или каталога
Ошибки: ls: pwd: нет такого файла или каталога
ProcessBuilder processBuilder = new ProcessBuilder("ls", "&&", "pwd");
Дает мне аналогичную ошибку:
Ошибки: ls: & &: Нет такого файла или каталога
Ошибки: ls: pwd: нет такого файла или каталога
List<String> command = new ArrayList<String>();
command.add("ls");
command.add(";");
command.add("pwd");
ProcessBuilder processBuilder = new ProcessBuilder(command);
Дает мне следующую ошибку:
Ошибки: ls:;: Нет такого файла или каталога
Ошибки: ls: pwd: нет такого файла или каталога
Моя ОС - Linux/Mac OSX.
Ответы
Ответ 1
Ваши подходы эквивалентны вызову ls
с указанными аргументами. В обозначении Bash выполняется следующее:
ls ';' pwd
ls '&&' pwd
Если вы хотите, чтобы ls
и pwd
выполнялись как отдельные команды, вы можете использовать Bash (или другой язык оболочки), чтобы обернуть их в одну команду:
bash -c 'ls ; pwd'
который вы можете назвать следующим образом:
ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c", "ls ; pwd");
Ответ 2
Вы можете получить процесс из ProcessBuilder.start() из первой команды, подождите, используя waitFor(), а затем запустите второй.
Ответ 3
Я использую ProcessBuilder для компиляции Java-программы, и это работает для меня:
ProcessBuilder b = new ProcessBuilder("cmd.exe","/c","cd " + dir,
" & javac " + mapClassName + ".java -cp " + pathToProjectClasses);
- cmd.exe: запускает командную строку.
- \c: не уверен, что он делает, но это важно, вы можете увидеть эту ссылку для получения дополнительной информации (команды \? cmd)
- cd + dir: первая команда, и она меняет каталог на определенный путь, который является dir.
- &: это значит начать вторую команду после окончания первой
- javac: это слово и остальная часть строки - вторая команда
- -cp: путь к внешнему классу, используемому классом, который вы хотите скомпилировать.
Итак, у меня есть 2 команды: первая - команда cd
вторая - команда javac
и я последовательно выполняю их, используя &
.
Извините за мои плохие навыки письма, если я не объяснил свой код хорошо, пожалуйста, спросите меня обо всем, что вы хотите знать.