Esta pregunta es una secuela dehttps://stackoverflow.com/questions/7136899/how-does-grep-work
Parece que shell
expande *.*
todos los archivos aplicables/disponibles y los proporciona a utilidades como grep
.
¿Por qué es shell
necesario hacer eso? ¿Por qué no dejar la expansión del nombre de ruta a la propia utilidad?
Respuesta1
Bueno, una razón es que cada utilidad tendría que implementar esa funcionalidad. Si el shell lo hace, sólo se implementa una vez.
Respuesta2
Porque si el shell no proporcionara esta característica, cada pequeña utilidad tendría que implementarla.
Esto también garantiza que la expansión funcione exactamente de la misma manera para cada comando.
Por cierto, la expansión no ocurre solo en los argumentos del comando, puede ocurrir en cualquier parte de un script de shell; Por ejemplo:
for file in *.c; do something; done
Respuesta3
Si el shell no proporcionara esa funcionalidad, entonces cada utilidad necesitaría implementar su propia funcionalidad comodín (y probablemente la mayoría no se molestaría en hacerlo). Tal como están las cosas, cada utilidad sólo tiene que procesar nombres de archivos individuales, lo cual es mucho más sencillo.
Respuesta4
Es la filosofía de Unix de "Hacer que una herramienta haga bien una cosa". ¿Por qué alguien querría esa repetición de código en cada utilidad? ¿Cuál es el punto de tener todas y cada una de las utilidades después de que main() llame a expand_pathnames()? ¿Cuál es el punto de poner esa carga no sólo en los programas C, sino también en todos los lenguajes compilados y scripts? Todo eso no tiene sentido. Es por eso que Microsoft y la abominación cmd.exe se equivocaron desde el primer día :-)
Por cierto, si desea desactivar la distribución global de nombres de archivos, puede hacerlo con
$ set -f
$ echo *
*
$ set +f
$ echo *
readme foo.o bar.txt