O que exatamente acontece quando um comando interno é executado em um shell?

3

Eu sei que comandos externos são executados no shell criando um processo separado, mas o que exatamente acontece quando um comando interno é executado em um shell?

Eles são executados como uma função ou o shell cria um novo thread para executá-los?

    
por corneliusfelix 18.06.2013 / 22:10

3 respostas

6

Para o seu exemplo concreto, existe uma função cd_builtin , que é definida em builtins / cd.def (no código-fonte bash). Normalmente faz um cd chamando essa função. Mas ele pode ser usado primeiro se você usá-lo em um pipeline - por exemplo, cd / | echo forks e chamadas cd_builtin no filho. Você também pode perceber isso pela maneira como o diretório não muda:

anthony@Zia:~$ cd /tmp/
anthony@Zia:/tmp$ cd / | echo -n
anthony@Zia:/tmp$ cd /
anthony@Zia:/$ 

Observe como o diretório só muda quando não canço de cd .

    
por 18.06.2013 / 22:43
4

Comandos incorporados, por definição, são executados dentro do executável principal, ao contrário de um programa diferente.

Todos os comandos shell são síncronos: o shell aguarda que o comando seja concluído antes de executar o próximo. Ao executar um comando externo, o shell precisa criar um processo separado para executar esse comando e aguardar sua saída. Ao executar um comando interno, não há necessidade de criar um novo encadeamento de execução: o comando é executado dentro do encadeamento principal.

Eu não acho que nenhum dos shells comuns use threads em seu design interno. Os recursos do shell estão bastante atrelados ao tradicional modelo Unix de thread único por processo; não há problema no design de shell que os encadeamentos resolveriam.

É altamente provável que cada builtin seja implementado por uma função em algum nível no código-fonte do shell.

    
por 19.06.2013 / 02:55
3

Eu acho que eles funcionam como uma função dentro do espaço do executável bash . Há um comentário no Guia Avançado de Script do Bash que diz o seguinte:

trecho

A builtin is a command contained within the Bash tool set, literally built in. This is either for performance reasons -- builtins execute faster than external commands, which usually require forking off 1 a separate process -- or because a particular builtin needs direct access to the shell internals.

    
por 18.06.2013 / 22:18