Quick and Simple Executor of Bash Commands
How do you execute a new shell command from Ruby? There are many ways. None of them offers a one-liner that would execute a command, print its output to the console or a logger, and then raise an exception if the exit code is not zero. This small gem offers exactly this one-liner.
First, install it:
gem install qbash
Then, you can use qbash global function:
require 'qbash'
stdout = qbash('echo "Hello, world!"', log: $stdout)
If the command fails, an exception will be raised.
The function automatically merges stderr
with stdout
(you can't change this).
It's possible to provide the standard input and environment variables:
stdout = qbash('cat > $FILE', env: { 'FILE' => 'a.txt' }, stdin: 'Hello!')
It's possible to configure the logging facility too, for example, with the help of the loog gem (the output will be returned and printed to the logger):
require 'loog'
qbash('echo "Hello, world!"', log: Loog::VERBOSE)
You can also make it return both stdout and exit code, with the help
of the both
option set to true
:
stdout, code = qbash('cat a.txt', both: true, accept: [])
Here, the accept
param contains the list of exit codes that are "acceptable"
and won't lead to runtime failures. When the list is empty, all exists are
acceptable (there will be no failures ever).
The command may be provided as an array, which automatically will be converted to a string by joining all items with spaces between them.
qbash(
[
'echo "Hello, world!"'
'&& echo "How are you?"',
'&& cat /etc/passwd'
]
)
It is very much recommended to escape all command-line values with the help of the Shellwords.escape() utility method, for example:
file = '/tmp/test.txt'
qbash("cat #{Shellwords.escape(file)}")
Without such an escaping, in this example, a space inside the file
will lead to an unpredicatable result of the execution.
You can also set the maximum time for the command:
qbash("sleep 100", timeout: 4)
This command will raise exception after four seconds.
How to contribute
Read these guidelines. Make sure you build is green before you contribute your pull request. You will need to have Ruby 3.0+ and Bundler installed. Then:
bundle update
bundle exec rake
If it's clean and you don't see any error messages, submit your pull request.