Quién trata (interpreta) el * en
echo *
¿El eco ve a la estrella o al shell cuidarlo y devolver una lista de nombre de archivo ...
Qué pasa
cp temp temp*
Quién trata (interpreta) el * en
echo *
¿El eco ve a la estrella o al shell cuidarlo y devolver una lista de nombre de archivo ...
Qué pasa
cp temp temp*
Respuestas:
bash (o lo que sea que use como shell), es lo primero que lee cualquier entrada, y comenzará a interpretar caracteres especiales como ?
y *
. *
se expande a cualquier coincidencia en la CWD , lo que significa que el asterisco se sustituye por dichas coincidencias.
En la mayoría de los casos, esto es bastante sencillo, pero puede llevar a algunos casos confusos de vez en cuando.
Considera lo siguiente. Un directorio tiene este contenido:
Si luego escribe mv *
algo que sucede aparentemente extraño: test3
está ahí, pero el resto se ha ido. Si bien es extraño al principio, tiene sentido una vez que entiendes a qué le pasa realmente bash mv
. Debido al asterisco, bash interpreta mv *
como mv test test1 test2 test3
, y cuando mv obtiene esa lista, asumirá que el último argumento es el destino, que es donde se habrían movido todos los archivos.
En cuanto a los comandos que enumeró:
echo *
puede funcionar como un pobre hombre ls
. El shell expandirá el asterisco a lo que esté en ese directorio y, como estoy seguro de que ya lo sabe, echo
literalmente hará eco de todo lo que le haya pasado como argumento.cp temp temp*
se comportará de manera similar al mv
comando que describí anteriormente, a menos que solo haya un directorio llamado temp, en cuyo caso el nombre de origen y destino es el mismo, es decir, no hará nada.*
lugar de ls
. Por ejemplo, for f in *; do
es más confiable que for f in $(ls)
si un nombre de archivo contiene espacios en blanco o un carácter global. (Sin embargo, fallará si no hay archivos en el CWD, por lo que debe verificar ese caso.)
shopt nullglob
está.
echo *
, ese truco puede salvarte en algunos casos.
Como ya se dijo, el shell se expande, *
así que echo
reciba como argumentos lo que sea que encuentre en el directorio actual. Sin embargo, tenga en cuenta que si la expansión no conduce a nada, es decir, en ese caso si el directorio no contiene archivos no ocultos, *
se deja sin cambios y se pasa como está al comando llamado (a menos que se usen opciones no estándar con algunos shells como bash
). echo *
entonces no se va a comportar como un hombre pobre, ls
ya que el primero no imprimirá nada mientras que el segundo imprimirá *
.
Del mismo modo, cp /tmp/temp temp*
creará un archivo con nombre temp*
en el directorio actual si aún no hay al menos un archivo cuyo nombre comience temp
.
Finalmente, si desea *
que se pase sin cambios en cualquier caso, puede protegerlo de la expansión utilizando comillas simples '*'
, comillas dobles "*"
o barra diagonal inversa \*
.
En Bash, el shell se ocupa de ello. Ves que si incluso lo intentas *
sin eco
Nota: basado en algunos comentarios, sugeriría al ejecutar * ENTER, crear un directorio y usar el comando táctil para crear algunos archivos, y asegurarse de que ninguno de ellos, o al menos asegurarse de que el primero alfabéticamente, no sea el nombre de cualquier script o comando en la ruta.
$ *
bash: a: command not found
$ echo *
a a.aa a.ab a.b a.htm a.tx
Entonces ls *
es un poco cliché
En Windows, *
se maneja con el comando, por dir *.*
lo que no es un cliché.
Nota: al ver algunos comentarios, agregaría, existe el riesgo de ejecutar * y luego ENTER. Si tiene un archivo llamado rm que está primero en la lista del directorio, entonces es peligroso porque cualquier cosa después se eliminaría. Además, y esto es menos improbable, si el primer archivo en la lista del directorio es el nombre de un script en la ruta, entonces lo ejecutará.
rm
, por supuesto.
-rf
? Lo intenté touch -rf
y touch \-rf
no lo está creando.
-rf
. (Entiendo el peligro de un archivo llamado rm y un archivo llamado -rf, y el problema de escribir * y presionar enter en una carpeta importante, no planeo hacer eso)
El shell realiza varias expansiones antes de entregar los argumentos al comando.
Consulte también https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion
No es específico de bash, consulte http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01