我正在编写一个以交互方式运行外部子进程的程序,我需要输出句柄的内容在可用时立即输出到标准输出。我尝试过这样的事情:
main = do processInfo <- createProcess (proc "ghci" []){std_out = CreatePipe,
std_in = CreatePipe }
case processInfo of
(Just hIn, Just hOut, _, _) -> do mainloop hIn hOut
hClose hIn
hClose hOut
_ -> do error "Unable to start process"
mainloop :: Handle -> Handle -> IO ()
mainloop inh outh =
do ineof <- hIsEOF outh
if ineof
then return ()
else do inpStr <- hGetLine outh
putStrLn inpStr
mainloop inh outh
但这不起作用,因为它只能逐行识别输出,因此进程输出句柄上的任何未由换行符终止的输出都不会显示。我用 hGetContents 尝试过同样的事情,但它产生了相同的结果。我已经阅读了 System.Process 和 System.IO 的文档,并没有真正找到任何结论。