如何使用readProcessWithExitCode? (第2部分)

时间:2016-08-21 19:59:41

标签: haskell

How to use readProcessWithExitCode?的后续行动。

以下终端命令可以正常工作:

$ grep "run" ./*.hs

它只查找当前目录中包含字符串“runr”的所有hs文件。

但是Haskell中的这个命令返回一个退出代码(即使存在一些匹配的文件):

Prelude System.Process> readProcessWithExitCode "grep" ["run", "./*.hs"] ""

那么readProcessWithExitCode(或readProcess)如何处理参数列表呢?

1 个答案:

答案 0 :(得分:1)

当你在shell中运行命令时,shell会将“glob”./*.hs扩展为以.hs结尾的当前目录中的所有文件名。

因此grep命令永远不会看到参数./*.hs - 它只会看到实际的.hs文件名。

要使shell扩展glob模式,必须使用readCreateProcessWithExitCode并将CreateProcess值配置为调用shell:

readCreateProcessWithExitCode (shell "grep run ./*.hs") 

但是,您必须担心引用和转义参数。例如,如果你 正在为run this加注,您必须在

周围添加引号
readCreateProcessWithExitCode (shell "grep 'run this' ./*.hs") ""

而使用readProcess,您只需使用:

readProcess "grep" ["run this", ...] ""

并且不用担心第一个参数包含空格。

使用Glob包,您可以自己执行文件:

import System.FilePath.Glob

main = do
  files <- glob "./*.hs"
  let args = ["run"] ++ files
  readProcess "grep" args ""