Desidero richiamare un processo da un programma haskell e acquisire stdout e stderr.Haskell: System.Process unire stdout e stderr
Quello che faccio io:
(_, stdout, stderr) <- readProcessWithExitCode "command" [] ""
Il problema: In questo modo, stdout e stderr vengono catturati separatamente, ma voglio che i messaggi vengano visualizzati nel posto giusto (altrimenti avrei semplicemente stdout ++ stderr
che separa i messaggi di errore da le loro controparti stdout).
So che avrei potuto ottenere questo se avessi pipe l'output in un file, vale a dire
tmp <- openFile "temp.file" ...
createProcess (proc "command" []) { stdout = UseHandle tmp,
stderr = UseHandle tmp }
Quindi la mia soluzione attuale è quella di uscite di tubo ad un file temporaneo e leggere nuovamente. Comunque io sto cercando un approccio più diretto.
Se ero su Unix di sicuro mi piacerebbe semplicemente richiamare un comando di shell à la
command 2>&1
e basta. Tuttavia, mi piacerebbe avere questo più portatile possibile.
Ciò di cui ho bisogno: ho creato un minuscolo script di haskell cgi (solo per giocare con esso) che richiama un determinato programma e stampa l'output. Voglio html-escape dell'output, quindi non posso semplicemente riversarlo sullo stdout.
Stavo pensando: Forse è possibile creare un handle in-memory, come un PipedInputStream/PipedOutputStream in Java, o ArrayInputStream/ArrayOutputStream che consente di processare i flussi IO all'interno della memoria. Ho cercato una funzione :: Handle
su hoogle, ma non ho trovato nulla.
Forse c'è un altro modulo Haskell là fuori che mi consente di unire due flussi?
Forse ['createPipe'] (http://hackage.haskell.org/packages/archive/unix/latest/doc/html/System-Posix-IO-ByteString.html#v:createPipe) e [' fdToHandle '] (http://hackage.haskell.org/packages/archive/unix/latest/doc/html/System-Posix-IO-ByteString.html#v:fdToHandle) aiuterà. –