2016-08-21 1 views
0

Follow-up von How to use readProcessWithExitCode?.Wie verwendet man readProcessWithExitCode? (Teil 2)

Der folgende Terminal-Befehl funktioniert:

$ grep "run" ./*.hs 

Es all hs-Dateien mit der Zeichenfolge „RunR“ findet nur im aktuellen Verzeichnis.

Aber dieser Befehl in Haskell gibt einen Exit-Code (auch wenn es einige passende Dateien sind):

Prelude System.Process> readProcessWithExitCode "grep" ["run", "./*.hs"] "" 

Wie funktioniert readProcessWithExitCode (oder readProcess) befassen sich mit der Liste der Argumente, genau?

Antwort

1

Wenn Sie den Befehl in der Shell ausführen, erweitert die Shell den "glob" ./*.hs auf alle Dateinamen im aktuellen Verzeichnis mit der Endung .hs.

So der grep Befehl sieht nie das Argument ./*.hs - es wird nur die tatsächlichen .hs Dateinamen angezeigt.

die Schale Um das glob Muster, das Sie readCreateProcessWithExitCode mit einem Wert Createprocess verwenden müssen erweitern konfiguriert, um die Schale zu nennen:

readCreateProcessWithExitCode (shell "grep run ./*.hs") 

jedoch Sie dann über zu zitieren und zu entkommen Argumente kümmern. Zum Beispiel, wenn Sie greppen für run this werden Sie Anführungszeichen um die

readCreateProcessWithExitCode (shell "grep 'run this' ./*.hs") "" 

während bei readProcess hinzufügen müssen würden Sie nur verwenden:

readProcess "grep" ["run this", ...] "" 

und sich keine Sorgen, dass das erste Argument ein Leerzeichen enthält .

Mit dem Glob Paket können Sie die Datei ausführen Globbing selbst:

import System.FilePath.Glob 

main = do 
    files <- glob "./*.hs" 
    let args = ["run"] ++ files 
    readProcess "grep" args "" 
+0

Ok ich sehe. Ich kannte 'glob' nicht. Vielen Dank. Ich kannte 'readCreateProcess', das ist die Problemumgehung, die ich verwendet habe. –

+0

Nur zur Ergänzung, ich habe gerade die [Pfadbibliothek] (https://hackage.haskell.org/package/path) gefunden, die sehr schön ist, zwischen absoluten Pfaden und relativen Pfaden zu konvertieren (glob gibt absolute Pfade zurück). –

Verwandte Themen