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

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';




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

Search: