Haskell grep命令行readProcess的实现?

Haskell grep命令行readProcess的实现?,haskell,Haskell,我有一个shell命令行,我想在Haskell,f.e.: grep-n“358”cameraTest.owl 我已经在ghci上尝试过: readProcess "grep" ["-n","358"] "cameraTest.owl" 但它不起作用 如何处理Haskell中的函数readProcess 获取错误 Prelude System.Process> readProcess "grep" ["-n","358"] "cameraTest.owl" *** Exception:

我有一个shell命令行,我想在Haskell,f.e.:

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
根据,readProcess的第三个参数是表示标准输入的字符串。但在您的情况下,您似乎正在将文件变灰,因此不需要标准输入。只需将文件名作为列表中的另一个参数传递

像这样:

readProcess "grep" ["-n","358","cameraTest.owl"] ""
但是调用
grep
还有另一个问题grep在找不到行时返回一个。但是
readProcess
将任何非零退出代码解释为错误并抛出异常,这可能不是您想要的行为

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


编辑:正如蒂姆在评论中提到的,您也可以使用
readProcessWithExitCode
。我忘了那个功能。

这在什么方面目前不起作用?你没有得到回复吗?它会抛出错误吗?您遇到的问题到底是什么?我遇到了一个错误:由于使用'print'可能的修复:在交互式GHCi命令的stmt中为(Show(String->IO String))添加实例声明:print itDo我必须将代码放在do语句上吗?如何从IO字符串中提取字符串?我该如何解决这种情况?@damii请务必输入最后的
,我忘记把它放在我的答案的第一个版本中。
readProcessWithExitCode
readProcessWithExitCode
类似,只是它返回错误代码,而不是在非零时引发异常。(或者只是捕获异常。)@Damiii我指的是ExitCode类型,对应于生成的外部进程的退出代码。