Donc, je pensais que j'avais une bonne compréhension de cela, mais j'ai juste fait un test (en réponse à une conversation où je n'étais pas d'accord avec quelqu'un) et j'ai trouvé que ma compréhension était imparfaite ...
De manière aussi détaillée que possible, que se passe-t-il exactement lorsque j'exécute un fichier dans mon shell? Ce que je veux dire, c’est que si je tape: ./somefile some arguments
dans mon shell et appuie sur Entrée (et somefile
existe dans cwd, et j’ai lu + exécuté les autorisations sur somefile
), que se passe-t-il sous le capot?
Je pensais que la réponse était:
- Le shell fait un appel système en
exec
passant le chemin àsomefile
- Le noyau examine
somefile
et examine le nombre magique du fichier pour déterminer s'il s'agit d'un format que le processeur peut gérer. - Si le nombre magique indique que le fichier est dans un format que le processeur peut exécuter, alors
- un nouveau processus est créé (avec une entrée dans la table de processus)
somefile
est lu / mappé à la mémoire. Une pile est créée et l'exécution saute au point d'entrée du code desomefile
, avecARGV
initialisé à un tableau de paramètres (achar**
,["some","arguments"]
)
- Si le numéro de magie est un tralala puis
exec()
génère un nouveau procédé comme ci - dessus, mais l'exécutable utilisé est l'interpréteur référencé par le tralala (par exemple ,/bin/bash
ou/bin/perl
) etsomefile
est passé àSTDIN
- Si le fichier n'a pas de numéro magique valide, une erreur du type "fichier invalide (mauvais numéro magique): erreur de format Exec" se produit
Cependant, quelqu'un m'a dit que si le fichier est en texte brut, le shell tente d'exécuter les commandes (comme si j'avais tapé bash somefile
). Je n'y croyais pas, mais je l'ai juste essayé et c'était correct. J'ai donc clairement des idées fausses sur ce qui se passe réellement ici et j'aimerais comprendre les mécanismes.
Que se passe-t-il exactement lorsque j'exécute un fichier dans mon shell? (autant de détails est raisonnable ...)
source somefile
est très différent d’un nouveau processus déclenché par ./somefile
, cependant.
./somefile
cela entraînerait l’exécution des commandes par bash somefile
si le fichier n’avait pas de numéro magique. Je pensais que cela afficherait simplement une erreur, et à la place, cela semble être efficacesource somefile
somefile
s'agit d'un fichier texte, un nouveau shell est créé si j'essaie de l'exécuter. Un fichier echo $$
se comporte différemment si je l'exécute par rapport à son source.