5

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

grep <username> *.test

但是,可悲的是,

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

似乎在参数周围生成带有双引号的命令

grep "<username>" "*.test"

并且由于没有单独的文件称为星号点测试,grepbarfs。有带有.test扩展名的文件。

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

4

3 回答 3

9

"*" 不是由 展开grep,而是由 shell 展开。sh -c 'grep username *.test如果你想要扩展,你应该运行类似的东西。

更好的方法是使用createProcesswithShellCommand参数。

于 2013-10-31T10:55:00.333 回答
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
于 2013-10-31T11:05:04.457 回答
0

我通常使用systemfrom System.Cmd。您应该构建一个正确的 Shell 命令(例如,进行所有转义),但它的优点是它使用提供的字符串。

于 2013-10-31T11:23:04.420 回答