A resposta é mais ou menos que ls
é um executável externo. Você pode ver sua localização executando type -p ls
.
Por que não é ls
embutido no shell? Bem, por que deveria ser? O trabalho de um shell não é abranger todos os comandos disponíveis, mas fornecer um ambiente capaz de executá-los. Algumas shells modernas têm echo
, printf
e suas características como builtins, que não são tecnicamente construídas, mas são feitas por razões de desempenho quando são executadas repetidamente (principalmente em laços apertados). Sem torná-los construídos, o shell teria que bifurcar e executar um novo processo para cada chamada a eles, o que poderia ser extremamente lento.
No mínimo, a execução de ls
, um executável externo, requer a execução de uma das famílias de exec de chamadas do sistema. Você poderia fazer isso sem bifurcar, mas substituiria o shell principal que você está usando. Você pode ver o que acontece nessa instância fazendo o seguinte:
exec ls; echo "this never gets printed"
Como a imagem do processo do seu shell é substituída, o shell atual não está mais acessível depois de fazer isso. Para que o shell possa continuar a rodar após executar ls, o comando teria que ser construído no shell.
O bifurcação permite a substituição de um processo que não é seu shell principal, o que significa que você pode continuar a executar seu shell posteriormente.