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/bin
e 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 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 grep
comando 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 ls
comando como uma lista de palavras, que grep
trata 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*