$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
¿Por qué no es eco de una utilidad independiente como ls
, ps
, cat
etc.? ¿Por qué es específico de shell? ¿Alguna buena razón?
shell
command-line
shell-builtin
Lazer
fuente
fuente
echo
sin duda es un Bash incorporado. De hecho, es uno de los componentes principales más modernos.Respuestas:
Hay dos clases de incorporados:
Algunos comandos tienen que estar integrados en el programa shell porque no pueden funcionar si son externos.
cd
es uno de estos, ya que si fuera externo, solo podría cambiar su propio directorio; No podría afectar el directorio de trabajo actual del shell. (Ver también: ¿Por quécd
no es un programa? )La otra clase de comandos está integrada en el shell únicamente por eficiencia.
La página de manual contiene una sección sobre órdenes internas que menciona , y como ejemplos de comandos en esta clase.
dash
printf
echo
test
Los sistemas Unix siempre han incluido ejecutables separados para comandos en esa segunda clase. Estos ejecutables separados todavía están disponibles en todos los sistemas Unixy que he usado, a pesar de que también están integrados en cada shell que es probable que use. ( POSIX realmente requiere que estos ejecutables estén presentes).
Creo que
echo
se incorporó al shell en AT&T Unix System V Release 3.1. Lo baso en comparaciones de dos ediciones diferentes de manuales para sistemas Unix de la serie AT & Ts 3B1 . Alguien ha escaneado amablemente las ediciones de 1986 de estos manuales y los ha puesto en línea ; estos corresponden al lanzamiento original de SVR3. Puede ver queecho
no está en la lista en la página 523 del Manual del usuario de UNIX System V, Volumen II , donde lo esperaría si el comando se integrara en el shell. En mi copia local en papel de los manuales SVR3.1 de 1987,echo
se enumera en esta sección del manual.Estoy bastante seguro de que esta no es una innovación de Berkeley CSRG que AT&T trajo a casa. 4.3BSD salió el mismo año que SVR3, 1986, pero si mira la página de manual sh.1 de 4.3BSD , verá que
echo
no está en la lista de comandos incorporados de la sección "Comandos especiales". Si CSRG hizo esto, eso nos deja queriendo una fuente documentada para probarlo.En este punto, puede preguntarse si
echo
se construyó en el shell antes de SVR3.1 y que este hecho simplemente no se documentó hasta entonces. El código fuente de AT&T Unix anterior a SVR3 más nuevo disponible para mí está en el tarball PDP-11 System III , en el que encontrará el código fuente de shell Bourne. No lo encontraráecho
en la tabla de comandos integrada, que está en/usr/src/cmd/sh/msg.c
. Según las marcas de tiempo en ese archivo, eso prueba queecho
ciertamente no estaba en el shell en 1980.Trivialidades
El mismo directorio también contiene un archivo llamado
builtin.c
que no contiene nada sobre el punto para esta pregunta, pero encontramos este comentario interesante:fuente
print
comando incorporado para ksh que se dice que se comporta comoecho
. Este comando también está presente en algo como AT&T Unix SVR4 2.1 i386 de ISC.print "\012"
produce el mismo resultado que haría eco. ¿Me pregunto por qué ksh tenía impreso y no echo incorporado? De todos modos realmente interesante.Hay una tercera razón para que algunos comandos se incorporen: se pueden usar cuando ejecutar comandos externos es imposible.
A veces, un sistema se rompe tanto que el
ls
comando no funciona. En algunos casos, unecho *
seguirá funcionando.Otro ejemplo (¡más importante!) Es
kill
: Si un sistema se queda sin PID libres, no es posible ejecutarlo/bin/kill
(porque necesita un PID :-), pero el incorporadokill
funcionará.Por cierto,
which
es un comando externo (al menos no es interno en bash), por lo que no puede enumerar los comandos internos. Por ejemplo:fuente
ldconfig
menos que sepa EXACTAMENTE lo que está haciendo). Además, ¿qué pasa si vuela su / bin, o peor aún, su partición / sbin, pero aún tiene un shell cargado?ps
comando, por lo que deberá buscar los PID manualmente/proc
.which
es un alias bash que se ejecutaalias | /usr/bin/which --read-alias ...
para que el externowhich
pueda identificar alias (pero aún no está integrado). No puedo decidir si considerar esto brillante o pervertido.De acuerdo con el Manual de referencia de Bash , se trata de conveniencia.
La Guía avanzada de secuencias de comandos Bash tiene una explicación más detallada:
También tenga en cuenta que
echo
existe como una utilidad independiente en algunos sistemas. Esto es lo que tengo en mi sistema Darwin (MacOSX 10.5.8 - Leopard)echo
también está disponible como una versión incorporada, pero aparentemente mis scripts usan / bin / echo en mi Mac, y usan una versión Bash incorporada en la mayoría de mis sistemas Linux y FreeBSD. Pero eso no parece importar, porque las secuencias de comandos todavía funcionan bien en todas partes.fuente
type
.Para complementar la respuesta de bhm, digamos que
/bin
se eliminó accidentalmente de suPATH
. Te gustaría poderecho $PATH
averiguarlo, ¿verdad?fuente
Aunque la mayoría de los shells incluyen un incorporado
echo
hoy en día, los CoreUtils de GNU también incluyen una implementación independiente del mismo:Parece que no tiene GNU Coreutils instalado (la mayoría de los sistemas operativos de escritorio y servidor basados en Linux lo tienen instalado de forma predeterminada, pero Linux incorporado u otro UNIX podrían usar colecciones alternativas de utilidades de shell en su lugar).
Por cierto: si miras Busybox , verás eso
ls
,ps
ycat
también hay comandos incorporados allí (o al menos puede ser; se usa para sistemas integrados y todo lo que no se necesita puede omitirse).fuente
/bin/echo
no existe. Solo muestran que el incorporado tiene prioridad sobre cualquierecho
programa en la RUTA.Aquí está la verdadera razón por la cual
echo
debería ser un shell incorporado:Supongamos que tiene una contraseña
$PASSWORD
. ¿Cómo se escribe en un archivo./password
? Naturalmente, la mayoría de los programadores escribirían:Sin embargo, si
echo
no fuera un shell incorporado, la contraseña se filtraría a todos los usuarios a través de laps
información.Por supuesto, si desea ser inteligente al respecto, puede encontrar una manera de almacenar una contraseña sin
echo
, quizás explotando alguna otra función de shell:Sin embargo, tener
echo
un builtin incorporado es un cinturón de seguridad importante, ya que la forma más obvia de guardar una contraseña en un archivo también debería funcionar.fuente