Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Why does this work? I always thought brackets were used to select a set of files. For example

    foo-bar-{baz,quux}.txt = foo-bar-baz.txt
                             foo-bar-quux.txt


Don't think of it as selecting files. It's just simple string substitution/expansion. "foo-bar-{baz,quux}.txt" just expands to "foo-bar-baz.txt" and "foo-bar-quux.txt", which are then passed to "mv" as separate arguments. The corresponding files need not exist, as this is a separate bit of functionality than file globbing.


Pathname expansion (i.e. globbing) can't even be used this way as POSIX requires matched names to be lexicographically sorted. That's the first thing that came to mind, before I remembered that brace expansion is a widely-supported extension not defined by POSIX.


Brace expansion doesn't fall under pathname expansion. There is no expectation that the resulting expansion will correspond to files. From `man bash`:

> Expansion is performed on the command line after it has been split into words. There are seven kinds of expansion performed: brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, word splitting, and pathname expansion.

That's not to say it's POSIX-compliant--I have no idea whether it is. But it definitely isn't grouped in with pathname expansion. bash does have an option to disable brace expansion, but it's not toggled by `--posix`, which leads me to believe it might be POSIX-compliant.


> Brace expansion doesn't fall under pathname expansion.

I thought that was implied in my post, but perhaps I should have made it explicit.

> That's not to say it's POSIX-compliant--I have no idea whether it is

I didn't know one way or another, but since you brought it up, it looks like it probably is not compliant. See, e.g., this argument that `echo {1,2}` must print '{1,2}' because POSIX doesn't require '{1,2}' to be quoted: https://www.austingroupbugs.net/view.php?id=1193

Brace expansion is a nearly universally supported extension, though, so I doubt it's a real problem. And the above link proposes fixing the standard to make the extension compliant.


Braces just evaluate and expand.

    $ echo {A,B}
    A B
    $ echo {A,B}{C,D}
    AC AD BC BD
    $ echo {A,B}{C,D}{E,F}
    ACE ACF ADE ADF BCE BCF BDE BDF


Wow, I had not realized that one could compute Cartesian products using a shell.


On the topic of things you didn't know the shell did: I found out about sequences recently and love them:

$ echo {0..19}

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

$ echo {00..19}

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19


Looks like it also works with single letters.

$echo {A..D}

A B C D


Hmm, I'd always used the "seq" command for that...

$ echo `seq 0 19`

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19


Perl is very much like this too.

$ perl -le 'print join(" ", "00".."20")' 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20


wow, genius!

(the second doesn't work on older versions of bash, like macos)


Well, using Bash. A lot of these tricks aren't portable so you'll have fun when your scripts break on e.g. Dash (Ubuntu).


Also works on zsh and fish, though fish does not enumerate in the same order. Indeed does not work on sh.

Thanks for the heads up.

Too bad it's not portable, but I guess this is mainly useful in an interactive shell.

I mostly use #!/usr/bin/env sh, so my scripts will remain free of shell Cartesian products and other brace expansions.


It's also inside Perl as bsd_glob().

  use File::Glob ':bsd_glob';


That's exactly why that works, the shell expands it, so

    mv foo-bar-{baz,quux}.txt
becomes

    mv foo-bar-baz.txt foo-bar-quux.txt


Shell expansion into the two strings and the order you mentioned. These two strings are passed along the argument vector to the mv command.


The { .. } stuff expands regardless of whether it matches files.

Unlike *, ? [a-z] ...




Consider applying for YC's Winter 2026 batch! Applications are open till Nov 10

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: