我想从Haskell运行外部程序并检索其输出和错误流的内容.在其中一个库中我找到了这段代码:
runProcess :: FilePath -> [String] -> IO (ExitCode, String, String)
runProcess prog args = do
(_,o,e,p) <- runInteractiveProcess prog args Nothing Nothing
hSetBuffering o NoBuffering
hSetBuffering e NoBuffering
sout <- hGetContents o
serr <- hGetContents e
ecode <- length sout `seq` waitForProcess p
return (ecode, sout, serr)
Run Code Online (Sandbox Code Playgroud)
这是正确的做法吗?这里有一些我不理解的东西:为什么要设置流NoBuffering?为什么length sout 'seq'?这感觉就像某种黑客.此外,我想将输出和错误流合并为一个,以获得与2>&1在命令行上所做的相同的效果.如果可能,我想避免使用专用的I/O库并依赖GHC提供的标准软件包.
使用 Shelly,一个在 Haskell 中进行类 shell 编程的模块:
http://hackage.haskell.org/package/shelly-1.4.1/docs/Shelly.html