Подтвердить что ты не робот

Использование Java ProcessBuilder для выполнения команды Piped

Я пытаюсь использовать класс Java ProcessBuilder для выполнения команды, в которой есть канал. Например:

ls -l | grep foo

Однако я получаю ошибку:

ls: |: no such file or directory

С последующим:

ls: grep: no such file or directory

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

Есть ли способ сделать это?

4b9b3361

Ответ 1

Это должно работать:

ProcessBuilder b = new ProcessBuilder("/bin/sh", "-c", "ls -l| grep foo");

Чтобы выполнить конвейер, вы должны вызвать оболочку, а затем запустите свои команды внутри этой оболочки.

Ответ 2

Самый простой способ - вызвать оболочку с командной строкой в ​​качестве параметра. В конце концов, это оболочка, которая интерпретирует "|" чтобы означать "передавать данные между двумя процессами".

В качестве альтернативы вы можете запускать каждый процесс отдельно и читать со стандартного вывода "ls -l", записывая данные на стандартный ввод "grep" в вашем примере.