How do I use Ruby for shell scripting? How do I use Ruby for shell scripting? ruby ruby

How do I use Ruby for shell scripting?


By default, you already have access to Dir and File, which are pretty useful by themselves.

Dir['*.rb'] #basic globsDir['**/*.rb'] #** == any depth of directory, including current dir.#=> array of relative namesFile.expand_path('~/file.txt') #=> "/User/mat/file.txt"File.dirname('dir/file.txt') #=> 'dir'File.basename('dir/file.txt') #=> 'file.txt'File.join('a', 'bunch', 'of', 'strings') #=> 'a/bunch/of/strings'__FILE__ #=> the name of the current file

Also useful from the stdlib is FileUtils

require 'fileutils' #I know, no underscore is not ruby-likeinclude FileUtils# Gives you access (without prepending by 'FileUtils.') tocd(dir, options)cd(dir, options) {|dir| .... }pwd()mkdir(dir, options)mkdir(list, options)mkdir_p(dir, options)mkdir_p(list, options)rmdir(dir, options)rmdir(list, options)ln(old, new, options)ln(list, destdir, options)ln_s(old, new, options)ln_s(list, destdir, options)ln_sf(src, dest, options)cp(src, dest, options)cp(list, dir, options)cp_r(src, dest, options)cp_r(list, dir, options)mv(src, dest, options)mv(list, dir, options)rm(list, options)rm_r(list, options)rm_rf(list, options)install(src, dest, mode = <src's>, options)chmod(mode, list, options)chmod_R(mode, list, options)chown(user, group, list, options)chown_R(user, group, list, options)touch(list, options)

Which is pretty nice


As the others have said already, your first line should be

#!/usr/bin/env ruby

And you also have to make it executable: (in the shell)

chmod +x test.rb

Then follows the ruby code. If you open a file

File.open("file", "r") do |io|    # do something with ioend

the file is opened in the current directory you'd get with pwd in the shell.

The path to your script is also simple to get. With $0 you get the first argument of the shell, which is the relative path to your script. The absolute path can be determined like that:

#!/usr/bin/env rubyrequire 'pathname'p Pathname.new($0).realpath()

For file system operations I almost always use Pathname. This is a wrapper for many of the other file system related classes. Also useful: Dir, File...


Here's something important that's missing from the other answers: the command-line parameters are exposed to your Ruby shell script through the ARGV (global) array.

So, if you had a script called my_shell_script:

#!/usr/bin/env rubyputs "I was passed: "ARGV.each do |value|  puts valueend

...make it executable (as others have mentioned):

chmod u+x my_shell_script

And call it like so:

> ./my_shell_script one two three four five

You'd get this:

I was passed: onetwothreefourfive

The arguments work nicely with filename expansion:

./my_shell_script *I was passed: a_file_in_the_current_directoryanother_file    my_shell_scriptthe_last_file

Most of this only works on UNIX (Linux, Mac OS X), but you can do similar (though less convenient) things in Windows.