"ls | grep zip" frente a "grep zip $(ls)"

"ls | grep zip" frente a "grep zip $(ls)"

Estoy aprendiendo sobre expansión/sustitución de comandos y, mientras analizaba un ejemplo, noté que estos dos comandos tienen resultados diferentes.

Por ejemplo, si ingreso cd /usr/biny lo ejecuto ls | grep zip, grep selecciona "zip" solo en los nombres de los archivos.

Pero cuando ejecuto grep zip $(ls)en el mismo directorio, grep también recoge zip en el contenido del archivo. ¿Por qué? Ubuntu 16.04.

Sé que es una pregunta para principiantes, pero aún así sería útil saber por qué. Gracias.

Respuesta1

Esto se debe a que greppuede funcionar en dos 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.

En ls | grep zip, el grepcomando ve una lista de nombres de archivos en su entrada estándar y la busca.

En grep zip $(ls), el shell sustituye los resultados del lscomando como una lista de palabras, que greptrata como argumentos de nombre de archivo, buscando el patrón en cada uno de ellos zip.

NOTA IMPORTANTE: si alguno de los nombres de archivo contiene espacios, las partes separadas por espacios se tratarán como argumentos separados, lo que dará como resultado No such file or directory errores.Una forma más segura de buscar archivos coincidentes es utilizar globos de shell, por ejemplogrep 'pattern' *zip*

información relacionada