“ls | grep zip ”vs.“ grep zip $ (ls) ”

0

Estou aprendendo sobre substituição de expansão / comando e, ao mesmo tempo em que estou pagando com um exemplo, percebi que esses dois comandos têm resultados diferentes.

Por exemplo, se eu fizer o cd em /usr/bin e executar ls | grep zip , o grep selecionará "zip" somente nos nomes dos arquivos.

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

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

    
por mxr 01.06.2018 / 16:34

1 resposta

8

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*

    
por steeldriver 01.06.2018 / 17:16