"ls | grep zip" versus "grep zip $(ls)"

"ls | grep zip" versus "grep zip $(ls)"

Estou aprendendo sobre expansão/substituição de comandos e, ao dar um exemplo, percebi que esses dois comandos têm resultados diferentes.

Por exemplo, se eu cd into /usr/bine run ls | grep zip, grep seleciona "zip" apenas nos nomes dos arquivos.

Mas quando executo grep zip $(ls)no mesmo diretório, o grep também pega o zip no conteúdo do arquivo. Por que? Ubuntu 16.04.

Eu sei que é uma pergunta para iniciantes, mas ainda seria útil saber por quê. Obrigado.

Responder1

Isso ocorre porque greppode 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 grepcomando 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 lscomando como uma lista de palavras, que greptrata como argumentos de nome de arquivo, pesquisando cada uma delas pelo padrão zip.

NOTA IMPORTANTE: se algum dos nomes de arquivos contiver espaços, as partes separadas por espaços serão tratadas como argumentos separados, resultando em No such file or directory erros.Uma maneira mais segura de pesquisar arquivos correspondentes é usar shell globs, por exemplogrep 'pattern' *zip*

informação relacionada