O shell expande seu *
para todos os arquivos correspondentes no diretório atual antes de grep
vê-lo, então o comando após a expansão é
grep test1 test2 test3.sh
grep
interpreta o primeiro argumento test1
como o padrão a ser procurado e os outros argumentos como os nomes dos arquivos a serem examinados. A saída de ls
é passada como texto em STDIN de grep
e não como nomes de arquivos, e parece que isso é ignorado, já que não faz sentido na sintaxe do grep
após a expansão ter sido realizada.
Sempre cite seu regex
$ ls | grep 'test*'
test1
test2
test3.sh