Использование Java ProcessBuilder для выполнения конвейерной команды - PullRequest
32 голосов
/ 23 сентября 2010

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

ls -l | grep foo

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

ls: |: no such file or directory

Далее:

ls: grep: no such file or directory

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

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

Ответы [ 2 ]

57 голосов
/ 23 сентября 2010

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

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

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

5 голосов
/ 23 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...