如何检索从Haskell执行的外部程序的输出?

Jan*_*rek 8 io haskell

我想从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提供的标准软件包.

har*_*arr 4

使用 Shelly,一个在 Haskell 中进行类 shell 编程的模块:

http://hackage.haskell.org/package/shelly-1.4.1/docs/Shelly.html