Existem duas classes de builtins:
-
Alguns comandos precisam ser construídos no próprio programa shell, porque eles não podem funcionar se forem externos.
cd
é um desses, pois, se fosse externo, só poderia alterar seu próprio diretório; não poderia afetar o diretório de trabalho atual do shell. (Veja também: Por que ocd
não é um programa? ) -
A outra classe de comandos é embutida no shell apenas por eficiência.
O
dash
man page tem uma seção no builtins que mencionaprintf
,echo
etest
como exemplos de comandos nesta classe.
Os sistemas Unix sempre incluíram executáveis separados para comandos nessa segunda classe. Esses executáveis separados ainda estão disponíveis em todos os sistemas Unixy que eu usei, mesmo que eles também estejam incorporados em todos os shell que você provavelmente usará. ( POSIX na verdade requer que esses executáveis estejam presentes.)
Acredito que echo
foi incorporado ao shell no AT & T Unix System V Release 3.1. Eu baseio isso em comparações de duas edições diferentes de manuais para AT & sistemas Unix da série 3B1 . Alguém gentilmente digitalizou as edições de 1986 desses manuais e as colocou online ; estes correspondem ao lançamento original do SVR3. Você pode ver que echo
não está na lista na página 523 do Manual do Usuário do UNIX System V, Volume II , onde você esperaria se o comando estivesse embutido no shell. Na minha cópia em papel local dos manuais do SVR3.1 de 1987, echo
é listado nesta seção do manual.
Tenho certeza de que esta não é uma inovação da Berkeley CSRG que a AT & T trouxe para casa. 4.3BSD saiu no mesmo ano que SVR3, 1986, mas se você olhar para 4.3BSD's sh.1 manpage , você vê que echo
não está na lista da seção "Special Commands" dos comandos internos. Se o CSRG fez isso, isso nos deixa querendo uma fonte documentada para provar isso.
Neste ponto, você pode se perguntar se echo
foi construído no shell antes do SVR3.1 e que este fato simplesmente não foi documentado até então. O mais novo código fonte pré-SVR3 AT & T Unix disponível para mim está no PDA do sistema III do PDP-11 , onde você encontrará o código fonte do shell Bourne. Você não encontrará echo
na tabela de comandos incorporada, que está em /usr/src/cmd/sh/msg.c
. Com base nos timestamps desse arquivo, isso prova que echo
certamente não estava no shell em 1980.
Curiosidades
O mesmo diretório também contém um arquivo chamado builtin.c
, que não contém nada de ponto para essa pergunta, mas encontramos este comentário interessante:
/*
builtin commands are those that Bourne did not intend
to be part of his shell.
Redirection of i/o, or rather the lack of it, is still a
problem..
*/