将系统命令的结果绑定到Haskell中的变量

时间:2016-05-09 04:53:37

标签: haskell system

如何在Haskell中运行系统命令将其结果(即标准输出)绑定到变量?在伪haskell中,我正在寻找以下内容:

import System.Process

main = do output <- callCommand "echo hi"
          putStrLn output -- result: "hi"

这不起作用。有类似的东西吗?

2 个答案:

答案 0 :(得分:6)

以下是一些有效的代码:

import System.Process

main :: IO ()
main = do
  let stdin' = ""
  (errCode, stdout', stderr') <- readProcessWithExitCode "echo" ["hi"] stdin'
  putStrLn $ "stdout: " ++ stdout'
  putStrLn $ "stderr: " ++ stderr'
  putStrLn $ "errCode: " ++ show errCode

正如Carsten所说,你可以使用readProcess,但我更喜欢这个版本,因为任何严重的用法,你很快会对你的命令为什么无声地失败感到困惑(如果你在命令行中运行,stdout和stderr当然是显示的。)

答案 1 :(得分:2)

扩展jamshidh的答案,如果不是将stdout和stderr设为String,而是将其设为ByteStringText,则可以使用process-extras包。

您还可以使用我的process-streaming包:

$ import System.Process.Streaming
$ execute (piped (shell "echo foo")) (liftA3 (,,) (foldOut intoLazyBytes)    
                                                  (foldErr intoLazyBytes)
                                                  exitCode)
("foo\n","",ExitSuccess)

同样适用于Text

$ import System.Process.Streaming.Text
$ execute (piped (shell "echo foo")) (liftA3 (,,) (foldOut (transduce1 utf8x intoLazyText)) 
                                                  (foldErr (transduce1 utf8x intoLazyText)) 
                                                  exitCode)
("foo\n","",ExitSuccess)