我正在尝试编写一些在外部运行grep
的代码,然后分析输出。具体来说,我想做
grep <username> *.test
但遗憾的是,
readProcess "grep" [username, "*.test"]
似乎在参数
周围生成带双引号的命令grep "<username>" "*.test"
因为没有名为asterisk-dot-test的单个文件,grep
barfs。有些文件的扩展名为.test
。
我可以说服readProcess
(或类似的东西)发出我想要的命令吗?
答案 0 :(得分:9)
“*”不是由grep
扩展,而是由shell扩展。如果要进行扩展,则应运行类似sh -c 'grep username *.test
的内容。
更好的方法是将createProcess
与ShellCommand
参数一起使用。
答案 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。