Cuando escribo evince *
en una carpeta con muchos archivos PDF, ¿qué se envía para evidenciar? ¿La evidencia recibe X argumentos, o se abren X ocasiones de evidencia y cada una obtiene un argumento (un solo archivo)?
Respuesta1
Bash realiza la expansión del shell en cada línea de comando. Una de esas expansiones esexpansión de nombre de archivoque reemplaza *
segúnla coincidencia de patronesnormas.
En el caso de evince *
, reemplaza el *
contenido del directorio de trabajo actual. El contenido significa nombres de archivos normales, subdirectorios, enlaces, etc. Se excluyen los archivos punto. Básicamente lo que obtienes al correr ls
. En su caso, nombres de archivos de archivos PDF.
evince
Por lo tanto, Bash ejecuta el binario solo una vez y los argumentos son nombres de archivos ordenados alfabéticamente contenidos en el directorio de trabajo actual. La forma en que Evince maneje su lanzamiento posterior depende de Evince o de cualquier marco o biblioteca del que dependa, pero barebones X no hace nada especial aquí. Evince o X ni siquiera saben que se ejecutó con *
. Por ejemplo:
$ ls -a
. .. .hiddendoc.pdf doc1.pdf doc2.docx otherdoc.pdf somedir
$ evince *
# is equivalent to
$ evince doc1.pdf doc2.docx otherdoc.pdf somedir
Si quieres saber cómo *
se expande, simplemente ejecuta echo *
. Puede notar que si el directorio de trabajo está vacío (contiene solo archivos de puntos), el asterisco no se expande y permanece como argumento para la ejecución del comando.
Como se menciona en el manual de Bash vinculado, hay varias configuraciones que cambian este comportamiento. Por no hablar de otras conchas.