cli-pasta

Build Status Gem Version

NAME

cli-pasta - handle Ctrl-C and broken-pipe errors gracefully in Ruby command-line tools

INSTALL

gem "cli-pasta"

SYNOPSIS

#!/usr/bin/env ruby

require "cli-pasta"
require "optparse"

# ...

ARGF.each do |line|
  puts process(line)
end

DESCRIPTION

cli-pasta packages boilerplate code which is commonly copied 'n' pasted into Ruby CLI scripts to perform the following tasks:

  • set up a SIGINT handler to handle Ctrl-C in the same way as other CLI tools
  • set up a SIGPIPE handler to handle broken pipes in the same way as other CLI tools

These tasks are executed by loading the corresponding files, either separately, e.g.:

require "cli-pasta/sigint"
require "cli-pasta/sigpipe"

Or as a group:

require "cli-pasta"

BACKGROUND

By default, ruby produces an ugly error message when scripts are interrupted by Ctrl-C (SIGINT), e.g.:

$ timeout --signal INT 1 ruby -e sleep

Output:

Traceback (most recent call last):
        1: from -e:1:in `<main>'
-e:1:in `sleep': Interrupt

The same is true if a process encounters an error when trying to write to a broken pipe (EPIPE), e.g.:

$ ruby -e 'loop { puts "." }' | head -n0

Output:

Traceback (most recent call last):
        5: from -e:1:in `<main>'
        4: from -e:1:in `loop'
        3: from -e:1:in `block in <main>'
        2: from -e:1:in `puts'
        1: from -e:1:in `puts'
-e:1:in `write': Broken pipe @ io_writev - <STDOUT> (Errno::EPIPE)

The snippets provided by this gem install signal handlers which handle these errors in the same way as other CLI tools, e.g.:

$ timeout --signal INT 1 ruby -r cli-pasta -e sleep
# No output

$ ruby -r cli-pasta -e 'loop { puts "." }' | head -n0
# No output

COMPATIBILITY

VERSION

2.0.1

SEE ALSO

  • nice-sigint - make Ruby handle SIGINTs in a less-ugly manner

AUTHOR

chocolateboy

COPYRIGHT AND LICENSE

Copyright © 2018-2020 by chocolateboy.

This is free software; you can redistribute it and/or modify it under the terms of the Artistic License 2.0.