No manual do bash , está escrito que
Builtin commands are contained >>> within <<< the shell itself
Além disso, esta resposta afirma que
A built-in command is simply a command that the shell carries out itself,
instead of interpreting it as a request to load and run some
>>> other program <<<
Quando eu executar compgen -b
em bash 4.4
, recebo uma lista de todos shell builtin comandos. Vejo, por exemplo, que [
e kill
estão listados como shell builtins. Mas suas localizações reais são:
/usr/bin/[
/bin/kill
Eu pensei que builtin
isso significa que o comando é compilado no /bin/bash
executável. Então, o que realmente está me confundindo: por favor, corrija-me, mas como um comando separado pode ser um builtin
, quando na verdade não faz parte do shell?
bash
shell
shell-builtin
manifestador
fonte
fonte
exec
manipular descritores de arquivos eeval
avaliar os comandos. Eles não são necessários como comandos independentes #Respostas:
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 incorporadoprintf
.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(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
portanto, é seguro se
printf
for um comando interno do shell. A restrição no comprimento da linha de comando vem daexecve()
função da biblioteca C usada para executar um comando externo. Se a linha de comando e o ambiente atual forem maiores queARG_MAX
bytes (vejagetconf ARG_MAX
no shell), a chamada paraexecve()
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 embutidobash
, use, por exemploHá uma pequena lista de utilitários que precisam ser incorporados ao shell (extraídos da lista de embutidos especiais do padrão POSIX )
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:Portanto, estou assumindo que os "especiais" embutidos não podem ter contrapartes externas, enquanto
cd
na teoria poderiam ter (mas não faria muito).fonte
chdir
/cd
eram binários externos nos primeiros Unices / pré-Unix antes de seremfork
introduzidos./usr/bin/cd
, mas na verdade não altera o diretório de trabalho atual. Seu manual diz:/usr/bin/cd
não tem efeito no processo de chamada, mas pode ser usado para determinar se um diretório pode ou não ser definido como o diretório atual.kill
também é bom porque não precisa bifurcar outro processo, bom se você atingir o limite de número de processos.Você está (muito compreensivelmente) confundido pelo fato de que alguns builtins existir tanto como builtins e como comandos externos. Portanto, enquanto você estiver certo de que, por exemplo, existe um
/bin/[
comando, isso não significa que sua "localização real" esteja/bin
.Qualquer maneira fácil de testar isso é executar
type
com o-a
switch que mostrará todas as instâncias disponíveis de um comando. No meu sistema Arch, isso mostra:Observe que
/sbin
,/usr/sbin
e/bin
todos os links simbólicos estão apontando para/usr/bin
que haja apenas um externo[
:Como você pode ver,
[
é um comando interno e externo, e o mesmo se aplica a vários outros recursos internos do shell. No entanto, isso não muda o fato de que eles também são embutidos no shell, compilados no próprio shell.fonte
/bin/printf
é instalado pelocoreutils
pacote e/bin/kill
porutil-linux
.