Entonces, pensé que tenía una buena comprensión de esto, pero solo realicé una prueba (en respuesta a una conversación en la que no estaba de acuerdo con alguien) y descubrí que mi comprensión es defectuosa ...
Con el mayor detalle posible, ¿qué sucede exactamente cuando ejecuto un archivo en mi shell? Lo que quiero decir es que si escribo: ./somefile some arguments
en mi shell y somefile
presiono Intro (y existe en el cwd, y tengo permisos de lectura + ejecución somefile
), ¿qué sucede debajo del capó?
Yo pensaba que la respuesta fue:
- El shell hace una llamada al sistema
exec
, pasando el camino asomefile
- El kernel examina
somefile
y mira el número mágico del archivo para determinar si es un formato que el procesador puede manejar - Si el número mágico indica que el archivo está en un formato que el procesador puede ejecutar, entonces
- se crea un nuevo proceso (con una entrada en la tabla de procesos)
somefile
se lee / se asigna a la memoria. Se crea una pila y la ejecución salta al punto de entrada del código desomefile
, conARGV
inicializado a una matriz de los parámetros (achar**
,["some","arguments"]
)
- Si el número mágico es un shebang, se
exec()
genera un nuevo proceso como el anterior, pero el ejecutable utilizado es el intérprete al que hace referencia el shebang (por ejemplo,/bin/bash
or/bin/perl
) ysomefile
se pasa aSTDIN
- Si el archivo no tiene un número mágico válido, se produce un error como "archivo no válido (número mágico incorrecto): error de formato de ejecución"
Sin embargo, alguien me dijo que si el archivo es texto sin formato, el shell intenta ejecutar los comandos (como si hubiera escrito bash somefile
). No lo creía, pero lo intenté y fue correcto. Así que claramente tengo algunas ideas erróneas sobre lo que realmente sucede aquí, y me gustaría entender la mecánica.
¿Qué sucede exactamente cuando ejecuto un archivo en mi shell? (con tanto detalle es razonable ...)
source somefile
Sin ./somefile
embargo, es muy diferente de un nuevo proceso que se bifurca .
./somefile
haría que bash ejecutara los comandos somefile
si el archivo no tuviera un número mágico. Pensé que solo mostraría un error, y en su lugar parece que efectivamentesource somefile
somefile
trata de un archivo de texto, se genera un nuevo shell si intento ejecutarlo. Un archivo se echo $$
comporta de manera diferente si lo ejecuto vs fuente.