
Considere estos shell
comandos
$ls
my_app newlist note
y
$echo *
my_app newlist note
y
$printf *
my_app
El primer comando ls
enumerará información sobre los archivos (el directorio actual de forma predeterminada). El segundo comando echo
es 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é echo
interpretar esto es *
así? ¿Y por qué printf
, siendo aún más extraño: solo generando el primero?
Respuesta1
¿Por qué echo
interpreta el *
hacer lo mismo que?ls
La respuesta es simple. No lo es. echo
hace 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 echo
simplemente hace lo suyo. Esta sustitución global ocurrirá portodocomandos, ya que lo hace el shell, no el comando.
Entonces ¿qué pasa printf
?
printf
es 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