我可以让readProcess删除引号吗?

时间:2013-10-31 10:37:46

标签: haskell process io system

我正在尝试编写一些在外部运行grep的代码,然后分析输出。具体来说,我想做

grep <username> *.test

但遗憾的是,

readProcess "grep" [username, "*.test"]

似乎在参数

周围生成带双引号的命令
grep "<username>" "*.test"

因为没有名为asterisk-dot-test的单个文件,grep barfs。有些文件的扩展名为.test

我可以说服readProcess(或类似的东西)发出我想要的命令吗?

3 个答案:

答案 0 :(得分:9)

“*”不是由grep扩展,而是由shell扩展。如果要进行扩展,则应运行类似sh -c 'grep username *.test的内容。

更好的方法是将createProcessShellCommand参数一起使用。

答案 1 :(得分:1)

你最好去createProcess,这是最常用的流程创建功能。有点像...

import System.Process
import System.IO

makeGrep username file = "grep " ++ username ++ " " ++ file

main :: IO ()
main = do
  (_, Just hOut, _, hProc) <- createProcess (
                                (shell (makeGrep "bob" "*.test"))
                                { std_out = CreatePipe }
                              )
  exitCode <- waitForProcess hProc
  output <- hGetContents hOut
  print output

答案 2 :(得分:0)

我通常使用System.Cmd中的system。您应该构建一个正确的Shell命令(例如,执行所有转义),但它的优点是它使用了所提供的String。