bash's globstar considered dumb (** not composable)

D. Hugh Redelmeier hugh-pmF8o41NoarQT0dZR+AlfA at public.gmane.org
Sat Sep 24 20:17:49 UTC 2011


In the shell, you can write a kind of regular expression to designate
all files which match that expression.  For example, "*.c" designates
all filenames which end in ".c".

Many years ago, I thought about how the notation ** isn't useful (it
would just be a synonym for *). and how it could be given another
interesting meaning.  I thought: why not allow it to match files
within subdirectories too.

I mentioned this to Rob Pike and he responded: bad idea because the
file structure might not be a tree:

- a DAG (Directed Acyclic Graph) due to hard links for files

- worse due to symlinks (which I still think of as evil)

- there was some thought of allowing hard links to directories (hasn't
  yet happened)

So I dropped the idea.

Fast forward a couple of decades: BASH 4 has this very feature.
Surely not due to my suggestion.

I tried it for the first time today.  I wrote "**.c".  It didn't work
the way I expected.  But "**" did.  Huh?  According to
<http://wiki.bash-hackers.org/syntax/expansion/globs>

    :V4: when the shell option globstar is set, the glob ** will
    recursively match all files and directories. This glob isn't
    "configurable", i.e. you can't do something like **.c to recursively
    get all *.c filenames.

The use of the word "configurable" seems really peculiar to me.  For
one thing, it is configurable: ** only works if you enable the
"globstar" option.  For another, what they clearly mean is composable:
you cannot compose it with other regular expression operators (which
includes literal elements).

Not being composable seems really really dumb.

Back to using the awkward but powerful find(1).
--
The Toronto Linux Users Group.      Meetings: http://gtalug.org/
TLUG requests: Linux topics, No HTML, wrap text below 80 columns
How to UNSUBSCRIBE: http://gtalug.org/wiki/Mailing_lists





More information about the Legacy mailing list