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 arguments
no meu shell e pressionar return (e somefile
existir 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
somefile
e 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
,ARGV
inicializado 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/bash
ou/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.
./somefile
faria com que o bash execute os comandos somefile
se 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
somefile
for 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.