How to use readProcessWithExitCode?的后续行动。
以下终端命令可以正常工作:
$ grep "run" ./*.hs
它只查找当前目录中包含字符串“runr”的所有hs文件。
但是Haskell中的这个命令返回一个退出代码(即使存在一些匹配的文件):
Prelude System.Process> readProcessWithExitCode "grep" ["run", "./*.hs"] ""
那么readProcessWithExitCode
(或readProcess
)如何处理参数列表呢?
答案 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 ""