Quando você faz grep ls* , o shell primeiro expande ls* para uma lista de arquivos correspondentes no diretório atual, então o comando se torna
ls -l | grep ls lsblk lsmod
Nesse caso, grep ignorará a entrada padrão e tratará o primeiro argumento ls como um padrão a ser correspondido dentro dos arquivos lsblk e lsmod , como se você digitado grep ls lsblk lsmod (presumivelmente em /bin ):
$ grep ls lsblk lsmod
Binary file lsblk matches
Binary file lsmod matches
Por outro lado, se não houver correspondências glob no diretório atual e a opção nullglob do shell não estiver definida, então ls* será deixado un expandido, de modo que grep vê ls* e corresponde a qualquer arquivo nomes correspondendo l seguido por zero ou mais s caracteres (basicamente qualquer nome de arquivo com l ) eg:
$ pwd
/home/steeldriver
$ echo ls*
ls*
(não há arquivos correspondentes ao shell glob ls* no meu diretório pessoal); então
$ ls /bin | grep 'ls*'
bzless
chacl
false
.
.
.
zless
tl; dr não faça isso