The plot thickens...
I double-checked the exact command I was running when I did the grep...
I ran:
n19 grep -r foobar /
n19 is an alias I've been using forever (and as per last month's RTFM): /bin/nice -19 /usr/bin/ionice -c2 -n7 -t
I n19 almost everything long-lasting / non-interactive I run.
It just dawned on me: "nah, the shell (tcsh) couldn't be expanding the n19 alias and *not* expanding the grep alias, could it?"
Sure enough, after a few tests, it is clear the shell only expands the first alias on the line. So that means (tada) my grep -r wasn't being run with the --devices option! That is why it was opening the device files. In my quest to be "nice", I shot myself in the foot.
So now the question is why doesn't the shell expand both aliases (I guess it's a safety / can't-tell-what-you-mean issue); is there a way to make the n19 alias expand the command listed after it too; or can I tell the shell to expand aliases after "modifier" commands (nice, xargs, etc).
Nice test case (may have to be modified for bash):
#alias n19 '/bin/nice -19 /usr/bin/ionice -c2 -n7 -t'
#nice n19 echo bobo /bin/nice: n19: No such file or directory
#n19 n19 echo bobo ionice: failed to execute n19: No such file or directory
In a perfect world the system would "do what I mean" and both above commands would succeed, just as this does:
nice nice echo bobo