2013-10-31 13 views
5

Ich versuche, einen Code zu schreiben, der extern grep läuft, dann analysiert die Ausgabe. Insbesondere möchte ichKann ich ReadProcess die Anführungszeichen löschen lassen?

grep <username> *.test 

aber leider tun,

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

scheint den Befehl mit doppelten Anführungszeichen um die Argumente

grep "<username>" "*.test" 

und zu erzeugen, da es keine einzelne Datei mit dem Namen Stern-Punkt-Test, grep Barfs. Es gibt Dateien mit .test Erweiterungen.

Kann ich readProcess (oder etwas Ähnliches) überreden, um den gewünschten Befehl auszugeben?

Antwort

9

"*" wird nicht um grep erweitert, sondern um Shell. Sie sollten etwas wie sh -c 'grep username *.test ausführen, wenn Sie die Erweiterung möchten.

Ein besserer Weg ist die Verwendung createProcess mit ShellCommand Argument.

+0

Es ist irgendwie unbequem, dass 'System.Process' kein Äquivalent von' readProcess' hat, das Shell-Escaping durchführt. Es ist ein ziemlich häufiger Anwendungsfall. –

+0

Das war ein nützlicher Hinweis, danke. Meine Problemumgehung, die jetzt den Job wie vorgesehen ausführt, besteht darin, den Befehl grep in ein Shellskript zu schreiben und dann das Skript mit 'readProcessWithExitCode' aufzurufen, da eine Nullantwort durchaus akzeptabel ist, aber von grep als Fehler gemeldet wird. – pigworker

1

Sie gehen wahrscheinlich am besten zu createProcess, das ist die allgemeinste Prozess-Erstellungsfunktion. So etwas wie ...

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 
+0

Seien Sie vorsichtig hier. Sie können durch die faule I/O, die vor sich geht, schlecht gebissen werden. Wenn Sie sich den Code für 'readProcess' in' System.Process' ansehen, können Sie sich ein Bild davon machen, was Sie tun müssen, um dies sicher zu tun. –

0

ich in der Regel system von System.Cmd verwenden. Sie sollten einen korrekten Shell-Befehl erstellen (z. B. alle Escapes ausführen), aber er hat den Vorteil, dass er den String verwendet, wie er bereitgestellt wird.

+0

Ich bin nicht sicher, wie ich die Ausgabe eines auf diese Weise ausgegebenen Befehls schnüffle. – pigworker

+0

Hmm, ich habe diese Anforderung verpasst. –

Verwandte Themen