O próprio shell tem um utilitário para gerar várias combinações. Eu não tenho certeza do termo técnico para isso, mas aqui está como funciona:
$ echo {1,2,3}{1,2,3}{1,2,3}
111 112 113 121 122 123 131 132 133 211 212 213 221 222 223 231 232 233 311 312 313 321 322 323 331 332 333
$ echo {a,b,c}{a,b,c}{a,b,c}
aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb cbc cca ccb ccc
$ echo {0,1}{0,1}{0,1}{0,1}
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Não é ideal, porém, se bem me lembro, eu estava tentando gerar uma lista de números de telefone ucranianos (para fins científicos, é claro), e acabei com erros. Então shell tem seus limites. Uma ferramenta escrita em uma linguagem de programação específica pode ser de melhor uso.