For a longer list (though the explanations are briefer), see Zenspider's Ruby QuickRef[1]. It also includes a handy listing of predefined global constants[2] (and a lot more).[3]
The former ubiquity of Perl made most of these common knowledge. For example, $? works in both Perl and bash (actually, I don't know which did this first...). So in the context of shell scripts, where Ruby started, having these magic globals makes a lot of sense.
IMO they can make code easier to understand, once you've learned what they mean. $2 conveys the same idea as matches[2] without having to think about array indices, and why the matches aren't zero-indexed like a normal array. This is obviously totally subjective.
Especially when Ruby has no way of scoping these variables... unlike Perl:
{
# level 1
local $\ = "[1]\n";
some_print_operation();
{
# level 2
local $\ = "[2]\n";
some_print_operation();
}
# level 1 again
some_print_operation();
}
# $\ back to what it was before all this :)
When using the debugger you can sometimes end up in an exception handler that doesn't provide a way to get access to said exception. $! can be a life-saver to help figure out what's going on, eg.
(rdb:1) list
11 do_something_stupid
12 rescue
=> 13 log("Something went wrong")
14 end
(rdb:2) e $!
#<Errno::ENOENT: No such file or directory - /tmp/durr>
[1]: http://zenspider.com/Languages/Ruby/QuickRef.html#pre-define...
[2]: http://zenspider.com/Languages/Ruby/QuickRef.html#pre-define...
[3]: http://zenspider.com/Languages/Ruby/QuickRef.html