如何从Haskell程序调用Bash或Shell脚本?

29

我正在使用Haskell编写一些Shell脚本,我在Git Bash中运行这些脚本,但是还有一些其他现有的脚本我希望能够从这些脚本中使用。

例如,我想运行Maven目标或执行git pull,但又不想专门与这些工具集成。

有没有办法做到这一点?


是的,并且异步地 https://github.com/friedbrice/dotfiles/blob/master/bin/git-fetch.hs :-) - Fried Brice
这个回答解决了你的问题吗?在Haskell中执行系统命令 - Chris Stryczynski
4个回答

31

你可以使用System.Process

例如,执行seq 1 10 shell命令:

> import System.Process

> readProcess "seq" ["1", "10"] ""
"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
it :: String

> readProcessWithExitCode  "seq" ["1", "10"] ""
(ExitSuccess,"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n","")
it :: (GHC.IO.Exception.ExitCode, String, String)

11

是的,这是可能的。您可以使用 process 包,该包导出许多有用的函数。 最简单的一个是 System.Cmd.system,它可以在 shell 中运行某些应用程序,并产生退出代码。

System.Process 模块还提供了更高级的功能。使用此模块,您可以以多种方式运行进程并与其通信(输入管道、退出代码、等待进程停止、修改其环境等)。


7
当然可以。您可以使用system来调用外部进程。
更复杂的管道和进程控制可在跨平台方面从System.Process库中获得。
最后,您可以考虑通过Shell DSLs将您的Shell脚本移植到Haskell中,进行转换

7

Turtle 是一款相当不错的现代 Haskell 库,专门用于 IT 技术。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接