Quindi, ho pensato di avere una buona comprensione di questo, ma ho appena eseguito un test (in risposta a una conversazione in cui non ero d'accordo con qualcuno) e ho scoperto che la mia comprensione è difettosa ...
Nel modo più dettagliato possibile, cosa succede esattamente quando eseguo un file nella mia shell? Quello che voglio dire è, se scrivo : ./somefile some arguments
nella mia shell e premo somefile
Invio (ed esiste nel CWD, e ho letto + esegui i permessi su somefile
) allora cosa succede sotto il cofano?
Ho pensato che la risposta fosse:
- La shell crea un syscall a
exec
, passando il percorso asomefile
- Il kernel esamina
somefile
e osserva il numero magico del file per determinare se è un formato che il processore può gestire - Se il numero magico indica che il file è in un formato che può essere eseguito dal processore, allora
- viene creato un nuovo processo (con una voce nella tabella dei processi)
somefile
viene letto / mappato in memoria. Viene creato uno stack e l'esecuzione passa al punto di ingresso del codice disomefile
,ARGV
inizializzato su un array di parametri (achar**
,["some","arguments"]
)
- Se il numero magico è una faccenda quindi
exec()
genera un nuovo processo come sopra, ma l'usato eseguibile è l'interprete a cui fa riferimento la shebang (ad esempio,/bin/bash
o/bin/perl
) esomefile
viene passato aSTDIN
- Se il file non ha un numero magico valido, si verifica un errore come "file non valido (numero magico errato): errore formato Exec"
Tuttavia qualcuno mi ha detto che se il file è di testo semplice, la shell tenta di eseguire i comandi (come se avessi digitato bash somefile
). Non ci credevo, ma l'ho appena provato ed era corretto. Quindi ho chiaramente alcune idee sbagliate su ciò che realmente accade qui e vorrei capire la meccanica.
Cosa succede esattamente quando eseguo un file nella mia shell? (in tutti i dettagli è ragionevole ...)
source somefile
è molto diverso da un nuovo processo da cui viene ignorato ./somefile
, però.
./somefile
avrebbe causato l'esecuzione da parte di bash dei comandi somefile
se il file non avesse un numero magico. Ho pensato che avrebbe mostrato solo un errore, e invece sembra effettivamentesource somefile
somefile
è un file di testo, viene generata una nuova shell se provo a eseguirlo. Un file echo $$
si comporta in modo diverso se eseguo vs sorgente.