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 и я последовательно выполняю их, используя &.

Извините за мои плохие навыки письма, если я не объяснил свой код хорошо, пожалуйста, спросите меня обо всем, что вы хотите знать.