Skip to content
Alexei Sholik edited this page Jun 6, 2014 · 2 revisions

This is a brain dump.


By using streams we can chain multiple external processes together:

alias Porcelain.Process

opts = [in: SocketStream.new('example.com', 80), out: :stream]
%Process{out: grep_stream} = Porcelain.spawn("grep", ["div", "-m", "4"], opts)

IO.inspect Porcelain.shell("head -n 4 | wc -l", in: grep_stream).out

Caveat #1: we are using head above in order to stop reading input after the first 4 lines. Otherwise wc alone would wait indefenitily for EOF which cannot be signaled when using bare Erlang ports. The (currently not implemented) Goon driver fixes the issue.

Caveat #2: of course it would be more efficient to just use shell piping if portability to non-POSIX systems isn't required.


Clone this wiki locally