Ответ 1
Это должно работать:
ProcessBuilder b = new ProcessBuilder("/bin/sh", "-c", "ls -l| grep foo");
Чтобы выполнить конвейер, вы должны вызвать оболочку, а затем запустите свои команды внутри этой оболочки.
Я пытаюсь использовать класс Java ProcessBuilder
для выполнения команды, в которой есть канал. Например:
ls -l | grep foo
Однако я получаю ошибку:
ls: |: no such file or directory
С последующим:
ls: grep: no such file or directory
Хотя эта команда отлично работает из командной строки, я не могу заставить ProcessBuilder
выполнить команду, которая перенаправляет ее вывод другой.
Есть ли способ сделать это?
Это должно работать:
ProcessBuilder b = new ProcessBuilder("/bin/sh", "-c", "ls -l| grep foo");
Чтобы выполнить конвейер, вы должны вызвать оболочку, а затем запустите свои команды внутри этой оболочки.
Самый простой способ - вызвать оболочку с командной строкой в качестве параметра. В конце концов, это оболочка, которая интерпретирует "|" чтобы означать "передавать данные между двумя процессами".
В качестве альтернативы вы можете запускать каждый процесс отдельно и читать со стандартного вывода "ls -l", записывая данные на стандартный ввод "grep" в вашем примере.