Automatic globbing of ARGV

I found a funny feature of Ruby tonight: if possible, commandline
arguments are automatically globbed. For instance in a directory with
one file foo.bar:

test.rb *.bar
=> ARGV = [‘foo.bar’]

test.rb .html
=> ARGV = [’
.html’]

Even the ** kind of globbing works.

I’ve tried to search google and the pickaxe book, but haven’t found any
documentation on this feature.

Comments are appreciated.

-Christian

Christian M. wrote:

Even the ** kind of globbing works.

I’ve tried to search google and the pickaxe book, but haven’t found any
documentation on this feature.

The globbing isn’t happening in Ruby, it’s happening in the shell that
launches Ruby.

In a directory with only foo.bar present, this will work:

$ echo *.bar

foo.bar

In a directory with many files, all will be globbed (except “.” and
“…”),
if you:

$ echo *

(long list)

This is standard shell behavior. It precedes execution of the command at
the
left.

On Wed, 27 Sep 2006 12:27:55 -0700, Christian M. wrote:

I found a funny feature of Ruby tonight: if possible, commandline
arguments are automatically globbed. For instance in a directory with
one file foo.bar:

test.rb *.bar
=> ARGV = [‘foo.bar’]

test.rb .html
=> ARGV = [’
.html’]

If a file matching the glob exists, then your shell globs it.
If a file matching the glob doesn’t exist, then

  • csh spits out an error message, always
  • bash just passes the glob unchanged (as “*.html” here)

Christian M. wrote:

Finally, after looking into the ruby source, I can see that in fact,
ruby calls “ruby_globi” in win32.c. This also explains why dir-glob,
‘**’, worked.

So is it that Ruby on Win32 is covering for limitations of DOS/Cmd?
Nifty.

Nic

Just to clear things out, I am using win32.

So I created a test.c program:
void main(int argc, char *argv[])
{
int i;
for (i = 0; i < argc; i++)
printf("%s\n", argv[i]);
}

test.exe *.c
=> *.c

Which indicates that ruby does the globbing.

Finally, after looking into the ruby source, I can see that in fact,
ruby calls “ruby_globi” in win32.c. This also explains why dir-glob,
‘**’, worked.

-Christian

Ken B. skrev: