Os comandos incorporados ao shell geralmente são incorporados devido ao aumento de desempenho que isso proporciona. Ligar para o externo printf
, por exemplo, é mais lento do que usar o incorporado printf
.
Como alguns utilitários não precisam ser integrados, a menos que sejam especiais, cd
também são fornecidos como utilitários externos . Isso ocorre para que os scripts não sejam interrompidos se forem interpretados por um shell que não fornece um equivalente interno.
Alguns recursos internos do shell também fornecem extensões para o comando equivalente externo. Bash's printf
, por exemplo, é capaz de fazer
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(imprima em uma variável) que o externo /usr/bin/printf
simplesmente não seria capaz de fazer, pois não tem acesso às variáveis do shell na sessão atual do shell (e não pode alterá-las).
Os utilitários incorporados também não têm a restrição de que sua linha de comando expandida tenha que ser menor que um determinado comprimento. Fazendo
printf '%s\n' *
portanto, é seguro se printf
for um comando interno do shell. A restrição no comprimento da linha de comando vem da execve()
função da biblioteca C usada para executar um comando externo. Se a linha de comando e o ambiente atual forem maiores que ARG_MAX
bytes (veja getconf ARG_MAX
no shell), a chamada para execve()
falhará. Se o utilitário estiver embutido no shell, execve()
não precisará ser chamado.
Utilitários incorporados têm precedência sobre os utilitários encontrados em $PATH
. Para desativar um comando embutido bash
, use, por exemplo
enable -n printf
Há uma pequena lista de utilitários que precisam ser incorporados ao shell (extraídos da lista de embutidos especiais do padrão POSIX )
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Eles precisam ser integrados, pois manipulam diretamente o ambiente e o fluxo do programa da sessão atual do shell. Um utilitário externo não seria capaz de fazer isso.
Curiosamente, cd
não faz parte desta lista, mas o POSIX diz o seguinte sobre isso:
Como cd
afeta o ambiente de execução atual do shell, ele sempre é fornecido como um built-in regular do shell. Se for chamado em um subshell ou ambiente de execução de utilitário separado, como um dos seguintes:
(cd /tmp)
nohup cd
find . -exec cd {} \;
isso não afeta o diretório de trabalho do ambiente do chamador.
Portanto, estou assumindo que os "especiais" embutidos não podem ter contrapartes externas, enquanto cd
na teoria poderiam ter (mas não faria muito).