Bem, a sequência exata pode variar, pois pode haver um alias ou função de shell que primeiro seja expandida / interpretada antes que o programa seja executado e, em seguida, diferenças para um nome de arquivo qualificado ( /usr/libexec/foo ) versus algo que será procuramos por todos os diretórios da variável de ambiente PATH (apenas foo ). Além disso, os detalhes da execução podem complicar, pois foo | bar | zot requer mais trabalho para o shell (alguns fork(2) , dup(2) e, é claro, pipe(2) , entre outras chamadas do sistema), enquanto algo como exec foo é muito menos trabalho como o shell apenas substitui-se com o novo programa (ou seja, não fork ). Também são importantes os grupos de processos (especialmente o grupo de processos em primeiro plano, todos os PIDs que comem SIGINT quando alguém inicia o processamento em Ctrl + C , sessões e se o trabalho é será executado em segundo plano, monitorado ( foo & ) ou em segundo plano, ignorado ( foo & disown ). Os detalhes de redirecionamento de E / S também mudarão as coisas, por exemplo, se a entrada padrão for fechada pelo shell ( foo <&- ), ou se um arquivo é aberto como stdin ( foo < blah ).
strace ou similar será informativo sobre as chamadas de sistema específicas feitas ao longo deste processo, e deve haver páginas de manual para cada uma dessas chamadas. A leitura adequada do nível do sistema seria qualquer número de capítulos da "Programação Avançada no Ambiente UNIX" de Stevens, enquanto um livro de shell (por exemplo, "Do Bash ao Z Shell") abordará o lado do shell em detalhes.