minimalistic command line option parsing via -s

B

Bil Kleb

Hi,

I know, I'm slow, but I finally figured out the minimalistic
command line options parsing that zenspider et al use in utilities
like flog and sow (the gem skeleton generator that comes with Hoe).

Consider, for example,

#!/usr/bin/env ruby -s

$r ||= false

if defined? $h then
puts "usage: #{File.basename $0}"
puts " -h this usage message"
puts " -r recursive"
end

puts "Recursive option: #$r"

The secret sauce is the '-s' option passed to the interpreter,
which according to the PickAxe indicates, "Any command-line switches
found after the program filename, but before any filename arguments
or before a --, are removed from ARGV and set to a global variable
named for the switch."

Later,
 
J

Joel VanderWerf

Bil said:
Hi,

I know, I'm slow, but I finally figured out the minimalistic
command line options parsing that zenspider et al use in utilities
like flog and sow (the gem skeleton generator that comes with Hoe).

Consider, for example,

#!/usr/bin/env ruby -s

$r ||= false

if defined? $h then
puts "usage: #{File.basename $0}"
puts " -h this usage message"
puts " -r recursive"
end

puts "Recursive option: #$r"

The secret sauce is the '-s' option passed to the interpreter,
which according to the PickAxe indicates, "Any command-line switches
found after the program filename, but before any filename arguments
or before a --, are removed from ARGV and set to a global variable
named for the switch."

It's nice to have that for very short scripts, but for about 50 LOC you
can paste in an options parser that permits --foo style options, -xyz as
an alias for "-x -y -z", option arguments, argument conversion procs and
defaults, "-x123" as an alias for "-x 123", and even a way to interpret
"-v -v -v" as thrice verbose. One thing you can't have is _optional_
arguments to options (e.g. an option that takes 0 or 1 arguments).

http://redshift.sourceforge.net/argos.rb
 
A

Ari Brown

It's nice to have that for very short scripts, but for about 50 LOC
you can paste in an options parser that permits --foo style
options, -xyz as an alias for "-x -y -z", option arguments,
argument conversion procs and defaults, "-x123" as an alias for "-x
123", and even a way to interpret "-v -v -v" as thrice verbose. One
thing you can't have is _optional_ arguments to options (e.g. an
option that takes 0 or 1 arguments).


A really nice tool I stumbled on while e-stalking Ara Howard (hehe
sorry) was his main library (gem install main). He's got some example
code of it on his site, and it makes options really really easy!

Ari
-------------------------------------------|
Nietzsche is my copilot
 
J

Joel VanderWerf

Ari said:
A really nice tool I stumbled on while e-stalking Ara Howard (hehe
sorry) was his main library (gem install main). He's got some example
code of it on his site, and it makes options really really easy!

Just took a look at it... very powerful. It handles arguments (things
without -- or -) as well as options. It's also fairly complex, and not
the sort of thing you paste into a small script (almost 2000 lines).

Main looks like more of a complete framework for CLI (possibly like the
commandline gem--has anyone compared these two?). By contrast, argos
does just one thing: turn an arg string into a hash, based on a spec.
 
N

Nobuyoshi Nakada

Hi,

At Fri, 7 Sep 2007 00:30:05 +0900,
Bil Kleb wrote in [ruby-talk:267895]:
I know, I'm slow, but I finally figured out the minimalistic
command line options parsing that zenspider et al use in utilities
like flog and sow (the gem skeleton generator that comes with Hoe).

and mkconfig.rb and win32/{mkexports,resource}.rb too.
Consider, for example,

#!/usr/bin/env ruby -s

Multiple words in shebang line may not work as you expect.
 
J

James Edward Gray II

Hi,

I know, I'm slow, but I finally figured out the minimalistic
command line options parsing that zenspider et al use in utilities
like flog and sow (the gem skeleton generator that comes with Hoe).

Consider, for example,

#!/usr/bin/env ruby -s

$r ||= false

if defined? $h then
puts "usage: #{File.basename $0}"
puts " -h this usage message"
puts " -r recursive"
end

puts "Recursive option: #$r"

The secret sauce is the '-s' option passed to the interpreter,
which according to the PickAxe indicates, "Any command-line switches
found after the program filename, but before any filename arguments
or before a --, are removed from ARGV and set to a global variable
named for the switch."

I talk about this some in the summary for this quiz as well:

http://www.rubyquiz.com/quiz133.html

James Edward Gray II
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top