我试图弄清楚如何使用我开始的一个程序的输出流,RUN-PROGRAM
以便它可以用作另一个开始的程序的输入RUN-PROGRAM
(即,道德上的,也许是字面上的管道等价物)。我尝试过使用:INPUT
,:OUTPUT
和:WAIT
关键字参数的多种组合,但到目前为止,我所遇到的任何事情都没有成效。任何提示都会有所帮助;例如,我将如何ls | grep lisp
从 shell 做一些事情?
我的尝试之一是
(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
调用中,或仅添加到 for 的调用中grep
,并没有解决问题。在这种情况下,该函数将挂起,并且 break withC-c C-c
得到一个堆栈跟踪,表明有一个FLET
被调用的本地函数(通过定义)SB-UNIX:SELECT
已挂起。