Isso está acontecendo porque os a* e b* não são citados e, portanto, são expandidos pelo shell anterior sendo passado para grep . Por exemplo, considere este diretório:
$ ls
afile.txt bfile.txt regex.txt
Se eu tentar executar grep a* regex.txt , o a* se tornará afile.txt e é isso que será fornecido como um padrão de pesquisa para grep . Podemos usar a opção de depuração do bash ( set -x ) para demonstrar:
$ set -x
$ grep a* regex.txt
+ grep --color afile.txt regex.txt
O motivo pelo qual funcionou para d e não para a ou b é que você tem arquivos ou diretórios cujos nomes começam com a e b em seu diretório atual. Se você não fez, teria funcionado:
$ ls
afile.txt bfile.txt regex.txt
$ grep a* regex.txt ## no output, it's searching for 'afile.txt'
$ rm afile.txt ## now there are no filenames starting with a
$ grep a* regex.txt
1
11
111
1111
11111
111111
d
da
daa
daaa
b
bc
bcc
bccc
Para evitar isso, sempre cite seus padrões de pesquisa :
grep "a*" regex.txt
Ou
grep 'a*' regex.txt