Find file
Fetching contributors…
Cannot retrieve contributors at this time
143 lines (105 sloc) 3.91 KB

Cocaine Build Status

A small library for doing (command) lines.

API reference


The basic, normal stuff:

line ="echo", "hello 'world'")
line.command # => "echo hello 'world'" # => "hello world\n" 

Interpolated arguments:

line ="convert", ":in -scale :resolution :out",
                                :in => "omg.jpg",
                                :resolution => "32x32",
                                :out => "omg_thumb.jpg")
line.command # => "convert 'omg.jpg' -scale '32x32' 'omg_thumb.jpg'"

It prevents attempts at being bad:

line ="cat", ":file", :file => "haha`rm -rf /`.txt")
line.command # => "cat 'haha`rm -rf /`.txt'"

line ="cat", ":file", :file => "ohyeah?'`rm -rf /`.ha!")
line.command # => "cat 'ohyeah?'\\''`rm -rf /`.ha!'"

You can ignore the result:

line ="noisy", "--extra-verbose", :swallow_stderr => true)
line.command # => "noisy --extra-verbose 2>/dev/null"

# ... and on Windows...
line.command # => "noisy --extra-verbose 2>NUL"

If your command errors, you get an exception:

line ="git", "commit")
rescue Cocaine::ExitStatusError => e
  e.message # => "Command 'git commit' returned 1. Expected 0"

If your command might return something non-zero, and you expect that, it's cool:

line ="/usr/bin/false", "", :expected_outcodes => [0, 1])
rescue Cocaine::ExitStatusError => e
  # => You never get here!

You don't have the command? You get an exception:

line ="lolwut")
rescue Cocaine::CommandNotFoundError => e
  e # => the command isn't in the $PATH for this process.

But don't fear, you can specify where to look for the command:

Cocaine::CommandLine.path = "/opt/bin"
line ="lolwut")
line.command # => "lolwut", but it looks in /opt/bin for it.

You can even give it a bunch of places to look:

    FileUtils.rm("/opt/bin/lolwut")'/usr/local/bin/lolwut') {|f| f.write('echo Hello') }
    Cocaine::CommandLine.path = ["/opt/bin", "/usr/local/bin"]
    line ="lolwut") # => prints 'Hello', because it searches the path

Or just put it in the command:

line ="/opt/bin/lolwut")
line.command # => "/opt/bin/lolwut"

You can see what's getting run. The 'Command' part it logs is in green for visibility!

line ="echo", ":var", :var => "LOL!", :logger => # => Logs this with #info -> Command :: echo 'LOL!'

Or log every command:

Cocaine::CommandLine.logger ="date").run # => Logs this -> Command :: date


You can potentially increase performance by installing the posix-spawn gem. This gem can keep your application's heap from being copied when forking command line processes. For applications with large heaps the gain can be significant. To include posix-spawn, simply add it to your Gemfile or, if you don't use bundler, install the gem.


Security concerns must be privately emailed to

Question? Idea? Problem? Bug? Comment? Concern? Like using question marks?

GitHub Issues For All!


Copyright 2011 Jon Yurek and thoughtbot, inc. This is free software, and may be redistributed under the terms specified in the LICENSE file.