%22.png)
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/bin
y 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 grep
puede 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 grep
comando 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 ls
comando como una lista de palabras, que grep
trata 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*