Isso ocorre porque grep pode operar em dois modos distintos:
DESCRIPTION grep searches the named input FILEs for lines containing a match to the given PATTERN. If no files are specified, or if the file “-” is given, grep searches standard input. By default, grep prints the matching lines.
Em ls | grep zip , o comando grep vê uma lista de nomes de arquivos em sua entrada padrão e pesquisa isso.
Em grep zip $(ls) , o shell substitui os resultados do comando ls como uma lista de palavras, que grep trata como argumentos de nome de arquivo, pesquisando cada um por sua vez pelo padrão zip .
OBSERVAÇÃO IMPORTANTE: se algum dos nomes de arquivos contiverem espaços, as partes separadas por espaços serão tratadas como argumentos separados, resultando em No such file or directory erros. maneira de procurar arquivos correspondentes é usar globs shell, por exemplo grep 'pattern' *zip*