¿Cómo se pasa el * de bash a un programa?

¿Cómo se pasa el * de bash a un programa?

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.

evincePor 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.

información relacionada