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 argumentsdans mon shell et appuie sur Entrée (et somefileexiste 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
execpassant le chemin àsomefile - Le noyau examine
somefileet 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)
somefileest lu / mappé à la mémoire. Une pile est créée et l'exécution saute au point d'entrée du code desomefile, avecARGVinitialisé à 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/bashou/bin/perl) etsomefileest 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 somefileest très différent d’un nouveau processus déclenché par ./somefile, cependant.
./somefilecela entraînerait l’exécution des commandes par bash somefilesi 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
somefiles'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.