Noté que hay un ejecutable binario /bin/echoen mi sistema Ubuntu MATE 17.04.
Pensé, eso es extraño, porque
$ type echo
echo is a shell builtin
Las pruebas cursivas sugieren que /bin/echohace el mismo tipo de cosas que el Bash incorporado echo:
$ /bin/echo foo
foo
$ /bin/echo $USER
zanna
Entonces, ¿por qué hay otra versión echoseparada del programa Bash y por qué o cuándo querría usarlo?
command-line
bash
echo
Zanna
fuente
fuente

echose proporciona como un shell incorporado, mientras que esta pregunta por qué se proporciona como un comando externo.Respuestas:
Si abre una
bashsolicitud y escribe unechocomando, que utiliza un shell incorporado en lugar de ejecutarse/bin/echo. Las razones por las que todavía es importante/bin/echoexistir son:echoincorporado. Esto no es realmente requerido.Para ampliar el # 1, suponga que desea mover todos los archivos regulares cuyos nombres comenzado con
abccualquier partesrcadest. Hay varias formas de hacerlo, pero una de ellas es:Pero supongamos que, en lugar de solo ejecutar eso, desea ver todos los comandos que se ejecutarán primero. Bueno, entonces puedes anteponer
echoel comando, tal como lo harías en otros contextos:Pero
findno usa una concha. Eso corre/bin/echo.Además
findde-execo-execdir, el/bin/echoejecutable será llamado por otros programas que ejecutan programas pero no a través de un shell. Esto sucede con elxargscomando (que está relacionado confind), así como en otros contextos, como laExec=línea de un.desktoparchivo . Otro ejemplo es cuando ejecutasudo echo, que puede ser útil para probar sisudoestá funcionando.Del mismo modo, algunas conchas tienen una
printfconstrucción pero/usr/bin/printftambién existe.Una razón posible menos común que podría usar deliberadamente
/bin/echoes si confiaba en las diferencias entre este y elechocomando proporcionado por su shell.man echodocumentos/bin/echo;help echoenbashdocumentos elbashincorporado.echono es muy portátil, porque las diferentes implementaciones, tanto en sistemas operativos como en shells en el mismo sistema operativo, admiten diferentes opciones (por ejemplo,-e) y difieren en el tratamiento de las barras invertidas . Por supuesto, es mejor evitar depender de esos detalles y usarlosprintf, que es mucho más portátil .En
bash, puedes hacer que eltypeespectáculo incorporado/bin/echotambién, suponiendo que/binesté en tu$PATHcomo siempre debería ser, pasándole la-abandera :fuente
cdexiste un ejecutable (que, cuando se ejecuta, cambia el directorio y se cierra, dejando al llamador donde estaba antes) y algunos sistemas operativos tienen uno. Puede ser útil citar 4.1 en los estándares GNU .cdes simplemente como una prueba de capacidad para acceder a un directorio dado: si/usr/bin/cd some/dirtiene éxito, de una sola vez ha probado: a) quesome/direxiste, b) que es un directorio o un enlace a uno, yc) el existen los permisos necesarios para acceder a ese directorio; todo sin cambiar tu propio estado./bin/echo, no\bin\echo, a menos que estés usando Windows. ;)Eliah ha hecho un gran trabajo respondiendo esto, pero quiero comentar sobre la parte de "por qué hay otra versión
echoseparada 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):¿Cuántos de estos necesitan ser incorporados?
[,echo,false,printf,pwd,test, Ytrueno 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,printfal menos, se aprovecha de ser un incorporado:printf -v varguarda la salida en la variablevar.timeen bash también es especial: al ser una palabra clave, puede cronometrar listas de comandos arbitrarias en bash (el guión no tiene untimeequivalente).pwdtampoco 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
dashmanual * en realidad explica de pasada por qué estos son incorporados (énfasis mío):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. La
shde 2.9 BSD , y usted no encontrará unaechoorden 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.
**
zshlleva esta idea al extremo: los comandos que obtienes al cargar varios módulos, comozmv, 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?fuente
:ya que un externo realmente no sería un NOP, todavía tendría quePATHbuscar, intentar ejecutar el comando, etc., cuando todo lo que realmente quiere es no hacer nada expresamente.:como un constructor hace eso.pwdser incorporado para que funcione de la manera que lo hace, con el comportamiento predeterminado de mostrar la ruta "lógica" (pwd -L)./bin/pwdsolo podría implementar elpwd -Pcomportamiento de mostrarle los directorios principales reales, no el enlace simbólico que editócd.pwdEl estado de @PeterCordes está un poco comprometido por la presencia dePWD, pero sí, eso también es una instancia de bash que usa el estado incorporado para mejorar la funcionalidad