Eliah ha hecho un gran trabajo respondiendo esto, pero quiero comentar sobre la parte de "por qué hay otra versión echo
separada del programa Bash". Esa es la pregunta equivocada.
La pregunta correcta es: ¿por qué es esto una construcción incorporada en primer lugar , cuando podría haber sido (y es) un comando externo perfectamente bien?
Por simplicidad, eche un vistazo a los builtins en el tablero, un mísero 38 (bash tiene 61, en comparación, según la salida 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
¿Cuántos de estos necesitan ser incorporados? [
, echo
, false
, printf
, pwd
, test
, Y true
no necesitan ser órdenes internas: Ellos no hacen nada que sólo una orden interna puede hacer (o afectar obtener estado de cuerpo que no está disponible para comandos externos). Bash, printf
al menos, se aprovecha de ser un incorporado: printf -v var
guarda la salida en la variable var
. time
en bash también es especial: al ser una palabra clave, puede cronometrar listas de comandos arbitrarias en bash (el guión no tiene un time
equivalente). pwd
tampoco es necesario que esté integrado: cualquier comando externo heredará el directorio de trabajo actual (y también es un comando externo ).:
es una excepción, necesita un NOP y lo :
es. El resto realiza acciones que un comando externo puede realizar fácilmente.
Por lo tanto, una quinta parte de estas incorporaciones no necesita ser incorporada. ¿Porqué entonces? La página de dash
manual * en realidad explica de pasada por qué estos son incorporados (énfasis mío):
Builtins
Esta sección enumera los comandos incorporados que están incorporados porque
necesita realizar alguna operación que no puede ser realizada por otro
proceso. Además de estos, hay varios otros comandos que pueden
estar construido para la eficiencia (por ejemplo, printf (1), echo (1), prueba (1), etc.).
Eso es casi todo: estas construcciones están ahí porque se usan con tanta frecuencia, de forma interactiva y en scripts, y su funcionalidad es lo suficientemente simple como para que el shell pueda hacer el trabajo. Y lo que sucede: algunos (?) La mayoría de las conchas tomaron en el trabajo posterior ** Ir a. Lash
de 2.9 BSD , y usted no encontrará una echo
orden interna.
Por lo tanto, es completamente posible que un shell mínimo pueda omitir la implementación de comandos como los incorporados (no creo que ningún shell actual lo haga). El proyecto GNU coreutils no asume que los va a ejecutar en un shell particular, y POSIX requiere estos comandos. Entonces, coreutils proporciona estos de todos modos y omite aquellos que no tienen ningún significado fuera del shell.
* Esto es casi idéntico al texto de página de manual correspondiente para el shell Almquist , que es en lo que se basa el guión, el shell Debian Almquist.
** zsh
lleva esta idea al extremo: los comandos que obtienes al cargar varios módulos, como zmv
, son cosas en las que no pensarías que un shell necesita siquiera entrar . En ese punto, la verdadera pregunta es: ¿por qué usarías bash en lugar de zsh, que tiene todas estas funciones integradas?