将系统命令的结果绑定到 Haskell 中的变量
Binding the result of a system command to a variable in Haskell
运行 Haskell 和 中的系统命令如何将其结果(即标准输出)绑定到变量?在伪 haskell 中,我正在寻找类似以下内容的内容:
import System.Process
main = do output <- callCommand "echo hi"
putStrLn output -- result: "hi"
这不起作用。有类似的东西吗?
这是一些工作代码:
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)。
扩展 jamshidh 的回答,如果您不想将 stdout 和 stderr 作为 String
获取,而是希望将它们作为 ByteString
或 Text
,您可以使用 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)
运行 Haskell 和 中的系统命令如何将其结果(即标准输出)绑定到变量?在伪 haskell 中,我正在寻找类似以下内容的内容:
import System.Process
main = do output <- callCommand "echo hi"
putStrLn output -- result: "hi"
这不起作用。有类似的东西吗?
这是一些工作代码:
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)。
扩展 jamshidh 的回答,如果您不想将 stdout 和 stderr 作为 String
获取,而是希望将它们作为 ByteString
或 Text
,您可以使用 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)