¿Por qué el shell realiza la expansión del nombre de ruta de las utilidades?

¿Por qué el shell realiza la expansión del nombre de ruta de las utilidades?

Esta pregunta es una secuela dehttps://stackoverflow.com/questions/7136899/how-does-grep-work

Parece que shellexpande *.*todos los archivos aplicables/disponibles y los proporciona a utilidades como grep.

¿Por qué es shellnecesario 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

información relacionada