2013-10-31 5 views
5

Sto provando a scrivere del codice che esegue grep esternamente, quindi analizza l'output. In particolare, voglio farePosso rendere readProcess eliminare le virgolette?

grep <username> *.test 

ma, purtroppo,

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

sembra generare il comando con doppie virgolette gli argomenti

grep "<username>" "*.test" 

ed in quanto non v'è alcun singolo file chiamato asterisk-dot-test, grep barfs. Ci sono file con estensioni .test.

Posso convincere lo readProcess (o qualcosa di simile) a emettere il comando che desidero?

risposta

9

"*" non è espanso per grep, ma per shell. Dovresti eseguire qualcosa come sh -c 'grep username *.test se vuoi l'espansione.

Un modo migliore è utilizzare createProcess con argomento ShellCommand.

+0

È un po 'scomodo che 'System.Process' non abbia un equivalente di' readProcess' che esegue l'escaping della shell. È un caso d'uso piuttosto comune. –

+0

Questo è stato un utile indizio, grazie. La mia soluzione alternativa, che ora fa il lavoro come previsto, è scrivere il comando grep in uno script di shell, quindi richiamare lo script usando 'readProcessWithExitCode', poiché una risposta nulla è accettabile ma segnalata come fallimento da grep. – pigworker

1

Probabilmente è meglio andare a createProcess, che è la funzione di creazione di processo più generale. Qualcosa di simile ...

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

Fai attenzione qui. Puoi essere morso male dall'I/O pigro che sta succedendo. Se si guarda il codice per 'readProcess' in' System.Process', si può avere una buona idea di cosa è necessario per farlo in sicurezza. –

0

Io di solito uso system da System.Cmd. Dovresti creare un comando Shell corretto (ad esempio, eseguire tutte le operazioni di escape) ma ha il vantaggio che utilizza la String come viene fornita.

+0

Non sono sicuro di come snarf l'output di un comando emesso in quel modo. – pigworker

+0

Hmm, ho perso questo requisito. –

Problemi correlati