Eliah ha fatto un ottimo lavoro nel rispondere a questa domanda, ma voglio commentare la parte "perché c'è un'altra versione di echo
separata dal programma Bash". Questa è la domanda sbagliata.
La domanda giusta è: perché in primo luogo si tratta di un comando incorporato , quando avrebbe potuto essere (ed è) un comando esterno perfettamente perfetto?
Per semplicità, dai un'occhiata al builtin in trattino, un misero 38 (bash ha 61, per confronto, andando dall'output di 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
Quanti di questi devono essere integrati? [
, echo
, false
, printf
, pwd
, test
, E true
non hanno bisogno di essere builtins: Non fanno nulla che solo un incorporato può fare (influenzare o ottenere lo stato di shell che non è disponibile a comandi esterni). printf
Almeno Bash si avvantaggia di essere un builtin: printf -v var
salva l'output nella variabile var
. time
in bash è anche speciale: essendo una parola chiave, puoi cronometrare elenchi di comandi arbitrari in bash (il trattino non ha un time
equivalente). pwd
non è nemmeno necessario che sia incorporato: qualsiasi comando esterno erediterà l'attuale directory di lavoro (ed è anche un comando esterno ).:
è un'eccezione: è necessario un NOP ed :
è così. Il resto fa azioni che un comando esterno può facilmente fare.
Quindi, un quinto di questi builtin non ha bisogno di essere builtin. Allora perche? La dash
manpage * spiega in realtà perché questi sono builtin (sottolineatura mia):
builtins
Questa sezione elenca i comandi integrati che sono integrati perché
è necessario eseguire alcune operazioni che non possono essere eseguite da un altro
processi. Oltre a questi, ci sono molti altri comandi che possono
essere integrato per efficienza (es. printf (1), echo (1), test (1), ecc.).
È praticamente tutto: questi builtin sono lì perché sono usati così spesso, interattivamente e negli script, e la loro funzionalità è abbastanza semplice, che la shell può fare il lavoro. E così accade: alcuni (?) La maggior parte delle conchiglie hanno preso sul lavoro ** Torna. Ilsh
da 2.9 BSD , e non troverete un echo
incorporato.
Quindi, è del tutto possibile che una shell minima possa saltare l'implementazione di comandi come builtin (non credo che ci sia nessuna shell corrente). Il progetto GNU coreutils non presuppone che tu li esegua in una particolare shell e POSIX richiede questi comandi. Quindi, coreutils fornisce questi comunque e salta quelli che non hanno alcun significato al di fuori della shell.
* Questo è quasi identico al corrispondente testo di manpage per la shell Almquist , su cui si basa il trattino, la shell Debian Almquist.
** zsh
porta questa idea all'estremo: i comandi che ricevi caricando vari moduli, come zmv
, sono cose in cui non pensi che una shell debba nemmeno entrare . A quel punto, la vera domanda è: perché dovresti usare bash invece di zsh, che ha tutti questi builtin?