Common lisp 公共Lisp:uiop:运行程序输出,但uiop:启动程序不运行

Common lisp 公共Lisp:uiop:运行程序输出,但uiop:启动程序不运行,common-lisp,uiop,Common Lisp,Uiop,基本上 (uiop:运行程序“echo hello”:输出*标准输出*) 输出hello,而 (uiop:启动程序“echo hello”:输出*标准输出*) (uiop:启动程序“echo hello”:输出#.*标准输出*) (uiop:启动程序“echo hello”:输出:交互式) 输出任何东西;然而,如果我真的跑了 (uiop:运行程序“echo hello”:输出*标准输出*) 在它们之后,我确实得到了hello4次,表明echo hello确实运行了。为什么会这样?((强制输

基本上

(uiop:运行程序“echo hello”:输出*标准输出*)
输出
hello
,而

(uiop:启动程序“echo hello”:输出*标准输出*)
(uiop:启动程序“echo hello”:输出#.*标准输出*)
(uiop:启动程序“echo hello”:输出:交互式)
输出任何东西;然而,如果我真的跑了

(uiop:运行程序“echo hello”:输出*标准输出*)
在它们之后,我确实得到了
hello
4次,表明
echo hello
确实运行了。为什么会这样?(
(强制输出)
也不会改变任何内容。)


编辑:我正在使用含粘液的SBCL。正如评论中所建议的,在从终端运行它时,这与预期一样有效(我得到了输出)。

当您查看
运行程序
启动程序
的实现时,您会看到前者(在本例中…)执行
等待过程

如果对启动程序返回的进程信息发出
uiop:wait进程
,则会显示输出

我猜这是一种竞赛条件,在这种情况下,斯旺克或斯莱姆在做其他事情之前不会获得输出。我认为这是
启动程序的异步行为所固有的


我认为获得输出的最清晰的方法是指定
:output:stream
,然后在
启动程序的返回值上调用
过程信息输出
,使用可用的流,从终端调用sbcl并使用标准输出执行启动程序在这里工作。提及您使用的Lisp以及如何运行它可能是一个好主意(终端、slime等)。当您发布问题时,拥有代码和必要的信息通常会很有用,这些信息可用于重现问题。@RainerJoswig,我正在将SBCL与SLIME一起使用。@coredump,是的,我可以确认这种行为-它在终端上起作用。那么,这是一个bug吗?也许这是LAUNCH-PROGRAM的一个功能?请记住,这是非常重要的:我们使用SBCL,其输出流“连接”到GNU Emacs&SLIME。然后我们调用一个shell命令,该命令进行输出,然后到达->SBCL->gnuemacs&SLIME…我的用例实际上是异步的,所以调用
uiop:wait进程将不会有帮助。我正在使用
:output:stream
(并从单独的线程读取输出)。谢谢你的帮助!