为grep命令行实现readProcess?

时间:2014-06-15 07:08:42

标签: haskell

我有一个shell命令行,我想在Haskell中使用,例如:

grep -n "358" cameraTest.owl

我已经在ghci上试过了:

readProcess "grep" ["-n","358"] "cameraTest.owl" 

但它不起作用。

我如何处理Haskell中的函数readProcess

获取错误

Prelude System.Process> readProcess "grep" ["-n","358"] "cameraTest.owl"
*** Exception: readProcess: grep "-n" "358" (exit 1): failed

1 个答案:

答案 0 :(得分:2)

根据documentationreadProcess的第三个参数是表示标准输入的字符串。但在您的情况下,您似乎在贪图文件,因此不需要标准输入。只需将文件名作为列表中的另一个参数传递。

像这样:

readProcess "grep" ["-n","358","cameraTest.owl"] ""

但是,调用grep还有另一个问题。当没有找到行时,Linux中的grep返回non-zero exit code。但是readProcess将任何非零退出代码解释为错误并抛出异常,这可能不是您想要的行为。

因此,一种解决方案是依赖于低级createProcess函数,该函数在退出代码非零时不会抛出异常。但是在这种情况下,您必须编写代码来自己读取进程“stdout

蒂姆在评论中提及

编辑,您也可以使用readProcessWithExitCode。我忘了这个功能。