¿Por qué echointerpreta el *hacer lo mismo que?ls

¿Por qué echointerpreta el *hacer lo mismo que?ls

Considere estos shellcomandos

$ls
my_app  newlist  note

y

$echo *
my_app  newlist  note

y

$printf *
my_app

El primer comando lsenumerará información sobre los archivos (el directorio actual de forma predeterminada). El segundo comando echoes un comando que genera las cadenas que se pasan como argumentos. Sin embargo, cuando escribo, echo *el resultado es el mismo que ls.

Y printf *solo me da el primer nombre de archivo como salida.

¿Por qué echointerpretar esto es *así? ¿Y por qué printf, siendo aún más extraño: solo generando el primero?

Respuesta1

¿Por qué echointerpreta el *hacer lo mismo que?ls

La respuesta es simple. No lo es. echohace exactamente lo que usted dice: itera a través de sus argumentos y los genera con un espacio entre ellos.

Entonces, ¿por qué vemos un comportamiento como ls?

Esto se debe a que el shell sustituirá el *con una lista de parámetros que coincida con todos los archivos (sin comenzar con a .(a menos que dotglob esté activado)). Entonces echosimplemente hace lo suyo. Esta sustitución global ocurrirá portodocomandos, ya que lo hace el shell, no el comando.

Entonces ¿qué pasa printf?

printfes el formato de impresión. El primer argumento es el formato. Si lo haces printf "%s " *, entonces es como echo.

Si el primer archivo es hello%sworld, obtendrás:hellofile2world hellofile3world

Para explorar más

Prueba esto. Le ayudará a saber lo que está sucediendo. (No estoy sugiriendo que uses este código para nada real. Solo úsalo para aprender).

Pruebe cat /proc/self/cmdline * | less: mostrará al principio cómo se ve la línea de comando (después de que el shell haya hecho su parte).

Respuesta2

solo porque no tiene entrada para mostrar sino una lista de * (todos) los archivos como parámetro para mostrar como cadena

Tan sencillo como eso

mientras que * es un parámetro, hace eco del contenido "*" para que la lista de archivos

información relacionada