Processes Have Arguments
Every process has access to a special array called
ARGV. Other programming languages may implement it slightly differently, but every one has something called ‘argv’.
argv is a short form for ‘argument vector’. In other words: a vector, or array, of arguments. It holds the arguments that were passed in to the current process on the command line. Here’s an example of inspecting
ARGV and passing in some simple options.
$ cat argv.rb p ARGV $ ruby argv.rb foo bar -va ["foo", "bar", "-va"]
It’s an Array!
Unlike the previous chapter, where we learned that
ENV isn’t a
ARGV is simply an
Array. You can add elements to it, remove elements from it, change the elements it contains, whatever you like. But if it simply represents the arguments passed in on the command line why would you need to change anything?
Some libraries will read from
ARGV to parse command line options, for example. You can programmatically change
ARGV before they have a chance to see it in order to modify the options at runtime.
In the Real World
The most common use case for
ARGV is probably for accepting filenames into a program. It’s very common to write a program that takes one or more filenames as input on the command line and does something useful with them.
The other common use case, as mentioned, is for parsing command line input. There are many Ruby libraries for dealing with command line input. One called
optparse is available as part of the standard library.
But now that you know how
ARGV works you can skip that extra overhead for simple command line options and do it by hand. If you just want to support a few flags you can implement them directly as array operations.
# did the user request help? ARGV.include?('--help') # get the value of the -c option ARGV.include?('-c') && ARGV[ARGV.index('-c') + 1]