Noté que hay un ejecutable binario /bin/echo
en 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/echo
hace 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 echo
separada del programa Bash y por qué o cuándo querría usarlo?
command-line
bash
echo
Zanna
fuente
fuente
echo
se proporciona como un shell incorporado, mientras que esta pregunta por qué se proporciona como un comando externo.Respuestas:
Si abre una
bash
solicitud y escribe unecho
comando, que utiliza un shell incorporado en lugar de ejecutarse/bin/echo
. Las razones por las que todavía es importante/bin/echo
existir son:echo
incorporado. Esto no es realmente requerido.Para ampliar el # 1, suponga que desea mover todos los archivos regulares cuyos nombres comenzado con
abc
cualquier partesrc
adest
. 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
echo
el comando, tal como lo harías en otros contextos:Pero
find
no usa una concha. Eso corre/bin/echo
.Además
find
de-exec
o-execdir
, el/bin/echo
ejecutable será llamado por otros programas que ejecutan programas pero no a través de un shell. Esto sucede con elxargs
comando (que está relacionado confind
), así como en otros contextos, como laExec=
línea de un.desktop
archivo . Otro ejemplo es cuando ejecutasudo echo
, que puede ser útil para probar sisudo
está funcionando.Del mismo modo, algunas conchas tienen una
printf
construcción pero/usr/bin/printf
también existe.Una razón posible menos común que podría usar deliberadamente
/bin/echo
es si confiaba en las diferencias entre este y elecho
comando proporcionado por su shell.man echo
documentos/bin/echo
;help echo
enbash
documentos elbash
incorporado.echo
no 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 eltype
espectáculo incorporado/bin/echo
también, suponiendo que/bin
esté en tu$PATH
como siempre debería ser, pasándole la-a
bandera :fuente
cd
existe 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 .cd
es simplemente como una prueba de capacidad para acceder a un directorio dado: si/usr/bin/cd some/dir
tiene éxito, de una sola vez ha probado: a) quesome/dir
existe, 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
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
):¿Cuántos de estos necesitan ser incorporados?
[
,echo
,false
,printf
,pwd
,test
, Ytrue
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 variablevar
.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 untime
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):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
sh
de 2.9 BSD , y usted no encontrará unaecho
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, 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 quePATH
buscar, intentar ejecutar el comando, etc., cuando todo lo que realmente quiere es no hacer nada expresamente.:
como un constructor hace eso.pwd
ser incorporado para que funcione de la manera que lo hace, con el comportamiento predeterminado de mostrar la ruta "lógica" (pwd -L
)./bin/pwd
solo podría implementar elpwd -P
comportamiento de mostrarle los directorios principales reales, no el enlace simbólico que editócd
.pwd
El 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