{-# LANGUAGE ScopedTypeVariables #-} import Control.Exception import System.Environment (getArgs) import System.Exit (ExitCode) import System.IO import qualified System.Process as P import qualified Data.ByteString.Lazy.Char8 as L8 import qualified Data.ByteString.Lazy as L main :: IO () main = do cmd:args <- getArgs mapM_ (processWithStdin (P.proc cmd args) . flip L8.snoc '\n') . L8.lines =<< L.getContents processWithStdin :: P.CreateProcess -> L.ByteString -> IO ExitCode processWithStdin process input = do (Just stdinHdl, _, _, pHdl) <- P.createProcess process { P.std_in = P.CreatePipe } handle (\(_ :: IOException) -> return ()) $ do L.hPut stdinHdl input hClose stdinHdl P.waitForProcess pHdl