Eliah fez um ótimo trabalho em responder a isso, mas quero comentar sobre a parte "por que há outra versão do echo
programa Bash separado"? Essa é a pergunta errada.
A pergunta certa é: por que isso é embutido em primeiro lugar , quando poderia ter sido (e é) um comando externo perfeitamente adequado?
Por uma questão de simplicidade, dê uma olhada nos builtins no dash, um mísero 38 (o bash tem 61, para comparação, seguindo a saída de compgen -b
):
. continue getopts readonly type
: echo hash return ulimit
[ eval jobs set umask
alias exec kill shift unalias
bg exit local test unset
break export printf times wait
cd false pwd trap
command fg read true
Quantos destes precisam ser construídos? [
, echo
, false
, printf
, pwd
, test
, E true
não precisa ser builtins: Eles não fazem nada que só um builtin pode fazer (afectam ou obter estado shell que não está disponível para comandos externos). O Bash's, printf
pelo menos, tira vantagem de ser um builtin: printf -v var
salva a saída na variável var
. time
O bash também é especial: sendo uma palavra-chave, você pode cronometrar listas de comandos arbitrárias no bash (o dash não tem um time
equivalente). pwd
também não precisa ser incorporado - qualquer comando externo herdará o diretório de trabalho atual (e também é um comando externo ).:
é uma exceção - você precisa de um NOP, e :
é isso. O restante executa ações que um comando externo pode executar facilmente.
Portanto, um quinto desses componentes não precisa ser construído. Porquê então? A página de dash
manual * na verdade explica de passagem por que esses recursos estão embutidos (ênfase minha):
Builtins
Esta seção lista os comandos internos que estão embutidos porque eles
precisa executar alguma operação que não possa ser executada por um
processo. Além desses, existem vários outros comandos que podem
ser construído para eficiência (por exemplo, printf (1), eco (1), teste (1), etc.).
É praticamente isso: esses built-in estão lá porque são usados com frequência, de forma interativa e em scripts, e sua funcionalidade é simples o suficiente para que o shell possa fazer o trabalho. E assim acontece: algumas conchas (a maioria?) Assumiram o cargo. ** Volte para ash
partir do 2,9 BSD e você não encontrará um echo
builtin.
Portanto, é perfeitamente possível que um shell mínimo possa pular a implementação de comandos como builtins (acho que nenhum shell atual o faz). O projeto coreutils do GNU não pressupõe que você os execute em um shell específico, e o POSIX requer esses comandos. Portanto, o coreutils os fornece de qualquer maneira e ignora aqueles que não têm nenhum significado fora do shell.
* Isso é quase idêntico ao texto da página de manual correspondente do shell Almquist , no qual o dash, o shell Debian Almquist, é baseado.
** zsh
leva essa idéia ao extremo: os comandos que você obtém ao carregar vários módulos, como zmv
, são coisas que você não acha que um shell precisa entrar . Nesse ponto, a verdadeira questão é: por que você usaria o bash em vez do zsh, que possui todos esses recursos?