Cuando uso el type
comando para averiguar si se cat
trata de un programa integrado de shell o externo, obtengo el siguiente resultado:
-$ type cat
cat is hashed (/bin/cat)
-$
¿Esto significa que cat
es un programa externo que es /bin/cat
?
Me confundí, porque cuando revisé el resultado a continuación, echo
pude ver que es un programa, built-in
pero también/bin/echo
-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$
Por lo tanto, no pude usar la lógica que /bin/cat
necesariamente significa un programa externo, porque el eco /bin/echo
todavía era un programa incorporado.
Entonces, ¿cómo sé qué cat
es? ¿Incorporado o externo?
bash
cat
echo
shell-builtin
sps
fuente
fuente
type which
podría darle la respuesta por quéwhich
no le dará la respuesta.cat
yls
son / fueron escritos por el propio Stallman. Te sorprendería la cantidad de cosas que escribió. No olvide que escribió las primeras versiones del compilador que hoy es el mejor compilador del mundo que compila TODO y la mayoría de las utilidades principales. Solo digoRespuestas:
type
te dice qué usaría el shell. Por ejemplo:Eso significa que si, en el indicador de bash, escribe
echo
, obtendrá el incorporado. Si especifica la ruta, como en/bin/echo
, obtendrá el comando externo.which
, por el contrario, es un programa externo que no tiene un conocimiento especial de lo que hará el shell. En sistemas similares a debian,which
es un script de shell que busca en el RUTA el ejecutable. Por lo tanto, le dará el nombre del ejecutable externo incluso si el shell usaría un incorporado.Si un comando solo está disponible como incorporado,
which
no devolverá nada:Ahora, echemos un vistazo a
cat
:cat
es un ejecutable externo, no un shell incorporado.fuente
type -all echo
averiguar (en orden) cuáles son los diferentes "ecos" conocidos por el shell (el primero es el que llamará el shell, si no especifica algo para cambiar el orden, como invocar"echo"
o\echo
, ocommand echo
)echo
por razones históricas. Comenzó como un comando externo, luego se agregó como incorporado. Las primeras versiones del shell Bourne (/bin/sh
) no lo tenían./bin/echo
se mantuvo por compatibilidad, ya que todo tipo de cosas dependían de ello. (Lo mismo ocurrió contest
.)which
sí mismo puede ser un cmd incorporado en el shell, por ejemplo en tcsh:which which
which: shell built-in command.
cat is hashed (/bin/cat)
es igual quecat is /bin/cat
(es decir, es un programa externo ).La diferencia es que ya ejecutó
cat
en esta sesión, por lo que bash ya lo buscó$PATH
y almacenó la ubicación resultante en una tabla hash para que no tenga que volver a buscarla en esta sesión.Para ver todos los comandos que se han cifrado en su sesión, ejecute
hash
fuente
Otra forma de verificar la lista de shell incorporada: usando
compgen
cuál es el mismo shell incorporado!El siguiente comando enumera todos los comandos integrados de shell:
Puede verificarlo
cat
,echo
mediante greping como: -Puede ver
compgen -b | grep cat
devoluciones sin salida, significacat
que no está integrado en el shell .Visite una lista de opciones útiles proporcionadas por
compgen
.También puede usar el otro comando incorporado:
help
para mostrar shell-builtin.fuente
compgen
?man bash | grep -e '-A action$' -A 32
que probablemente obtengas resultados como este . (aumentar / disminuir el dígito después-A
de gestionar correctamente).También puede usar el comando
whereis
que es más eficiente porque muestra dónde está el comando en la máquina, como también la biblioteca de páginas del manual, etc.fuente
Otros ya han respondido sobre
cat
, solo me gustaría explicar el problema conecho
. Si utiliza su tipo de-a
opción (lista de todos los partidos), se verá queecho
es tanto una orden interna del shell y un programa externo:Los dos son completamente independientes el uno del otro.
type
sin opciones, simplemente devolverá el primer comando coincidente encontrado. Por lo tanto, el tipofoo
le mostrará lo que se ejecutará si ejecutafoo
. Puede haber otras opciones, pero no se mostrarán a menos que las use-a
.fuente
Dado que hay varias buenas respuestas aquí sobre el uso de type para averiguar si un comando como
cat
es un programa incorporado o externo. Voy a tomar un enfoque más general. Hay algunos comandos que deben estar integrados porque afectan al shell actual. Tres ejemplos clásicos soncd
,exec
yexit
. Hay algunos comandos que no deben estar integrados porque su funcionalidad depende del comportamiento de las llamadas al sistema o al execve. Ejemplos de tales programas incluyensu
,sudo
,calife
ysuper
. Todos los demás comandos se pueden construir como programas integrados o externos.cat
es un excelente programa de ejemplo de esta clase, ya que hay shells que lo incluyen como un builtin y shells que no lo incluyen. Vale la pena señalar que muchos comandos de esta clase que están disponibles como incorporados también están disponibles como programas externos.fuente