# ExCmd [![](](

ExCmd is an Elixir library to run and communicate with external programs with back-pressure.

ExCmd is built around the idea of streaming data through an external program. Think streaming a video through `ffmpeg` to serve a web request. For example, getting audio out of a stream is as simple as
``` elixir!(~w(ffmpeg -i pipe:0 -f mp3 pipe:1), input:!("music_video.mkv", [], 65336))
|> Stream.into(!("music.mp3"))

## Overview
ExCmd uses [odu]( middleware to interact with external process. It uses a demand-driven protocol for IO to have back-pressure. `!` is a stream interface for interacting with the command. One should prefer to use this over `ExCmd.Process`. Use `ExCmd.Process` if you need more control.

Check [documentation]( for information

### Major advantages over port
* Unlike beam ports, ExCmd puts back pressure on the external program
* Proper program termination. No more zombie process
* Ability to close stdin and wait for output (with ports one can not selectively close stdin)
* Stream abstraction

**Check out [Exile]( which is an alternative solution based on NIF**

**Note: ExCmd is still WIP. Expect breaking changes**

## Installation
1. Install [odu]( v0.2.3 and make sure its in your path
2. Install ExCmd
def deps do
    {:ex_cmd, "~> x.x.x"}