基本上,
(uiop:run-program "echo hello" :output *standard-output*)
输出hello
,而没有
(uiop:launch-program "echo hello" :output *standard-output*)
(uiop:launch-program "echo hello" :output #.*standard-output*)
(uiop:launch-program "echo hello" :output :interactive)
输出任何内容;但是,如果我运行
(uiop:run-program "echo hello" :output *standard-output*)
在他们之后,我确实得到了 4 次hello
表明echo hello
确实跑了。为什么会这样呢?((force-output)
也不会改变任何东西。
编辑:我正在使用SBCL和史莱姆。正如评论中所建议的,这在从终端运行它时按预期工作(我得到输出(。
当您查看run-program
和launch-program
的实现时,您会发现前者(在这种情况下...(执行wait-process
。
如果对launch-program
返回的进程信息发出uiop:wait-process
,则会显示输出。
我猜这是一种竞争条件,其中 swank 或 sslime 在执行其他操作之前无法获取输出。 我认为这是launch-program
异步行为所固有的。
我认为获取输出的最清晰方法是指定:output :stream
,然后在launch-program
的返回值上使用调用process-info-output
可用的流。