私は、開始したあるプログラムの出力ストリームを使用して、RUN-PROGRAM
開始した別のプログラムの入力として使用できるようにする方法を理解しようとしていますRUN-PROGRAM
(つまり、パイプの道徳的およびおそらく文字通りの等価物)。:INPUT
,:OUTPUT
と:WAIT
キーワード引数の組み合わせをいくつか試してみましたが、これまでのところ生産的なものは何もありませんでした. どんなヒントでも役に立ちます。たとえば、ls | grep lisp
シェルから次のようなことを行うにはどうすればよいでしょうか?
私の試みの1つは
(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