Os comandos que são construídos no shell são frequentemente construídos devido ao aumento de desempenho que isso causa. Chamar o external printf
, por exemplo, é mais lento do que usar o construído em printf
.
Como alguns utilitários não precisam ser incorporados, a menos que sejam especiais, como cd
, eles também são fornecidos como utilitários externos . Isso é para que os scripts não quebrem se forem interpretados por um shell que não forneça um equivalente interno.
Alguns built-ins de shell também fornecem extensões para o comando equivalente externo. O printf
do Bash, por exemplo, é capaz de fazer
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(imprima para uma variável) que o /usr/bin/printf
externo simplesmente não seria capaz de fazer, uma vez que não tem acesso às variáveis do shell na sessão atual do shell (e não pode alterá-las).
Utilitários incorporados também não têm a restrição de que sua linha de comando expandida deve 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 função de biblioteca execve()
C usada para executar um comando externo. Se a linha de comando e o ambiente atual forem maiores que ARG_MAX
bytes (consulte getconf ARG_MAX
no shell), a chamada para execve()
falhará. Se o utilitário estiver embutido no shell, execve()
não precisa ser chamado.
Os utilitários incorporados têm precedência sobre os utilitários encontrados em $PATH
. Para desativar um comando interno em bash
, use, por exemplo,
enable -n printf
Existe uma pequena lista de utilitários que precisam para serem construídos em um shell (extraído do padrão POSIX lista de built-ins especiais )
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Elas precisam ser incorporadas, pois manipulam diretamente o ambiente e o fluxo de 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 POSIX diz o seguinte sobre isso:
Since
cd
affects the current shell execution environment, it is always provided as a shell regular built-in. If it is called in a subshell or separate utility execution environment, such as one of the following:(cd /tmp) nohup cd find . -exec cd {} \;
it does not affect the working directory of the caller's environment.
Estou, portanto, assumindo que os built-ins "especiais" não podem ter contrapartes externas, enquanto cd
teoricamente poderia ter (mas não faria muito).