Я пытаюсь выяснить, как использовать поток вывода одной программы, которую я начинаю с RUN-PROGRAM
, чтобы его можно было использовать в качестве ввода другой программы, начинающейся с RUN-PROGRAM
(т. Е. Моральный и, возможно, буквальный эквивалент трубопроводов). Я попытался использовать несколько комбинаций аргументов ключевых слов :INPUT
, :OUTPUT
и :WAIT
, но ничего не выбрал
до сих пор был продуктивным. Любые советы будут полезны; например, как бы я сделал что-то вроде ls | grep lisp
из оболочки?
Одна из моих попыток
(defun piping-test ()
(let ((grep-process (run-program "/usr/bin/grep" '("lisp")
:input :stream
:output :stream)))
(unwind-protect
(with-open-stream (s (process-input grep-process))
(let ((ls-process (run-program "/bin/ls" '()
:output s)))
(when ls-process
(unwind-protect
(with-open-stream (o (process-output grep-process))
(loop
:for line := (read-line o nil nil)
:while line
:collect line))
(process-close ls-process)))))
(when grep-process (process-close grep-process)))))
Выполнение этого в SLIME REPL приводит к зависанию всего, пока я не сломаюсь
с C-c C-c
, так что это явно не то, но я
не уверен, как это изменить, так что это правильно.
РЕДАКТИРОВАНИЕ: Добавление :WAIT NIL
к обоим RUN-PROGRAM
вызовам или только к вызову для grep
не дает результата. В этом случае функция зависнет, и разрыв с C-c C-c
получит трассировку стека, указывающую, что есть локальная функция (определенная с помощью FLET
) с именем SB-UNIX:SELECT
, которая зависла.