[Haskell-cafe] Re: ANN: HSH 1.2.0
Brandon Michael Moore
brandon at heave.ugcs.caltech.edu
Tue Mar 13 14:50:28 EDT 2007
On Mon, Mar 12, 2007 at 05:14:57PM -0500, John Goerzen wrote:
> On 2007-03-06, Simon Marlow <simonmarhaskell at gmail.com> wrote:
> > John Goerzen wrote:
> >> possible to create a pipe going directly from program A to program B.
> >
> > You certainly can pipe directly from one process to another:
>
> That only works for 2 processes. What if I have 4 processes, and want
> to pipe from one to the next, all along, as in
>
> ls -l /tmp | tr a-zA-Z | sort | md5sum
>
> to give a contrived example
You can do this with runProcess, if you use
System.Posix.IO.{createPipe,fdToHandle} to make a pipe and
wrap the ends as handles. I hope hCreatePipe could be
implemented on windows.
>import System.IO
>import System.Process
>import System.Posix.IO
>run program arguments stdin stdout = runProcess program arguments Nothing Nothing stdin stdout Nothing
>hCreatePipe = do (readFd, writeFd) <- createPipe
> read <- fdToHandle readFd
> write <- fdToHandle writeFd
> return (read, write)
>main = do (read1, write1) <- hCreatePipe
> run "ls" ["-l","/tmp"] Nothing (Just write1)
> (read2, write2) <- hCreatePipe
> run "tr" ["a-z","A-Z"] (Just read1) (Just write2)
> (read3, write3) <- hCreatePipe
> run "sort" [] (Just read2) (Just write3)
> (read4, write4) <- hCreatePipe
> run "md5sum" [] (Just read3) (Just write4)
> hash <- hGetContents read4
> putStr hash
>
Brandon Moore
More information about the Haskell-Cafe
mailing list