mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-29 22:42:52 -06:00
GF shell: improved system_pipe (aka "?") command
1. No temporary files are created. 2. The output of a system command is read lazily, making it feasible to process large or even infinite output, e.g. the following works as expected: ? "yes" | ? "head -5" | ps -lextext
This commit is contained in:
18
src/compiler/GF/System/Process.hs
Normal file
18
src/compiler/GF/System/Process.hs
Normal file
@@ -0,0 +1,18 @@
|
||||
module GF.System.Process where
|
||||
import System.Process
|
||||
import System.IO(hGetContents,hClose,hPutStr)
|
||||
import Control.Concurrent(forkIO)
|
||||
import GF.System.Catch(try)
|
||||
|
||||
-- | Feed some input to a shell process and read the output lazily
|
||||
readShellProcess :: String -- ^ shell command
|
||||
-> String -- ^ input to shell command
|
||||
-> IO String -- ^ output from shell command
|
||||
readShellProcess cmd input =
|
||||
do (Just stdin,Just stdout,Nothing,ph) <-
|
||||
createProcess (shell cmd){std_in=CreatePipe,std_out=CreatePipe}
|
||||
forkIO $ do try $ hPutStr stdin input
|
||||
try $ hClose stdin
|
||||
waitForProcess ph
|
||||
return ()
|
||||
hGetContents stdout
|
||||
Reference in New Issue
Block a user