Então, achei que tinha um bom entendimento disso, mas apenas fiz um teste (em resposta a uma conversa em que discordava de alguém) e descobri que meu entendimento é defeituoso ...
Com o máximo de detalhes possível, o que exatamente acontece quando executo um arquivo no meu shell? O que quero dizer é que, se eu digitar: ./somefile some argumentsno meu shell e pressionar return (e somefileexistir no cwd e eu tiver lido + executar permissões ativadas somefile), o que acontecerá sob o capô?
Eu pensei que a resposta era:
- O shell faz um syscall to
exec, passando o caminho parasomefile - O kernel examina
somefilee analisa o número mágico do arquivo para determinar se é um formato que o processador pode manipular - Se o número mágico indicar que o arquivo está em um formato que o processador possa executar,
- um novo processo é criado (com uma entrada na tabela de processos)
somefileé lido / mapeado para a memória. Uma pilha é criada e a execução salta para o ponto de entrada do código desomefile,ARGVinicializado em uma matriz dos parâmetros (achar**,["some","arguments"])
- Se o número mágico for um shebang ,
exec()gera um novo processo como acima, mas o executável usado é o intérprete referenciado pelo shebang (por exemplo,/bin/bashou/bin/perl) esomefileé passado paraSTDIN - Se o arquivo não tiver um número mágico válido, ocorrerá um erro como "arquivo inválido (número mágico incorreto): erro de formato Exec"
No entanto, alguém me disse que, se o arquivo é texto simples, o shell tenta executar os comandos (como se eu tivesse digitado bash somefile). Eu não acreditava nisso, mas apenas tentei e estava correto. Portanto, tenho claramente algumas idéias erradas sobre o que realmente acontece aqui e gostaria de entender a mecânica.
O que exatamente acontece quando executo um arquivo no meu shell? (com o máximo de detalhes possível ...)
source somefileé muito diferente de um novo processo que está sendo iniciado por ./somefile, no entanto.
./somefilefaria com que o bash execute os comandos somefilese o arquivo não tiver um número mágico. Eu pensei que seria apenas exibir um erro, e em vez disso, parece efetivamentesource somefile
somefilefor um arquivo de texto, um novo shell será gerado se tentar executá-lo. Um arquivo echo $$se comporta de maneira diferente se eu executar o código-fonte.