There are countless ways to execute shell code in Ruby. You should always use capture3
, for which we have a dedicated card because it is so good.
All other methods to execute shell commands have signficant downsides, such as:
Always use capture3
.
This is just a reference for legacy code. For new code, always use capture3
.
Returns the standard output of running the given command in a subshell. This is an alias for `...`, and you can use string interpolation.
Example:
name = 'ls'
result = `which #{name}`
It does not escape anything you inject in the string.
If you want to find out if the call was successful you can ask $?.success?
.
Similar to exec
, but executes the given command in a subshell. Your script will go on. Returns:
true
if the command gives zero exit statusfalse
for non zero exit statusExample:
if system 'cp', '/full/path/to/my_file', '/target/directory'
puts "You made it!"
else
puts "Something went wrong"
end
Note that system
(as well as exec
) has two distinct argument patterns:
a single string argument is passed to the shell like "Hey, lets pretend the user typed this. Please run it!"
>> system 'echo *'
This is equivalent to:
$ echo *
Note how the asterisk is interpreted by the shell, as would any other characters (like a semicolon which separates commands).
Output will be something like:
file1 file2 file3
when passed multiple arguments, Ruby will take the first as command and find it on the $PATH. It then invokes it, passing the remaining arguments as Strings:
system 'echo', '*'
This is equivalent to:
$ /bin/echo '*'
Since Ruby is passing all arguments as Strings, there will be no wildcard expansion or the like.
Output will be:
*
You cannot freely mix these styles, and system
will fail when passing it invalid arguments:
system 'bundle exec rails server', '-p 3000' # fails and returns nil
This is equivalent to running a command called "bundle exec rails
" (including spaces in its filename). There is usually no such command anywhere on the $PATH
.
Note that you should prefer the 2nd approach (list of arguments instead of putting them into a single command) unless you absolutely know what you are doing.
Replaces the current process. Take care: when an exec
command exits, it exits your script as well; i.e. exec
will be the last statement executed in your Ruby script. Output is written to stdout
.
Raises SystemCallError
if the command couldn‘t execute.
Example:
^
puts "Creating directory..."
exec 'mkdir', 'new_directory'
# the code here and below will never be read
Takes the same parameters as exec
and system
: [env,] command [,options]
Optional hash with :name => environment_name
, e.g. spawn(:name => 'development', 'echo hello world')
exec('cat * | grep denied')
exec *[ 'git', 'add', 'Gemfile' ]
exec ['ls', 'foo'], 'foo.bar', 'baz.bar'
see the Ruby docs Show archive.org snapshot
The shell used is /bin/sh
on Unix-like systems, ENV["RUBYSHELL"]
or ENV["COMSPEC"]
on Windows NT series, and similar.
Spawn
calls
IO.popen
Show archive.org snapshot
.