Cuando uso el typecomando para averiguar si se cattrata de un programa integrado de shell o externo, obtengo el siguiente resultado:
-$ type cat
cat is hashed (/bin/cat)
-$
¿Esto significa que cates un programa externo que es /bin/cat?
Me confundí, porque cuando revisé el resultado a continuación, echopude ver que es un programa, built-inpero 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/catnecesariamente significa un programa externo, porque el eco /bin/echotodavía era un programa incorporado.
Entonces, ¿cómo sé qué cates? ¿Incorporado o externo?
bash
cat
echo
shell-builtin
sps
fuente
fuente

type whichpodría darle la respuesta por quéwhichno le dará la respuesta.catylsson / 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:
typete 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,whiches 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,
whichno devolverá nada:Ahora, echemos un vistazo a
cat:cates un ejecutable externo, no un shell incorporado.fuente
type -all echoaveriguar (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)echopor 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/echose mantuvo por compatibilidad, ya que todo tipo de cosas dependían de ello. (Lo mismo ocurrió contest.)whichsí mismo puede ser un cmd incorporado en el shell, por ejemplo en tcsh:which whichwhich: 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ó
caten esta sesión, por lo que bash ya lo buscó$PATHy 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
hashfuente
Otra forma de verificar la lista de shell incorporada: usando
compgencuál es el mismo shell incorporado!El siguiente comando enumera todos los comandos integrados de shell:
Puede verificarlo
cat,echomediante greping como: -Puede ver
compgen -b | grep catdevoluciones sin salida, significacatque no está integrado en el shell .Visite una lista de opciones útiles proporcionadas por
compgen.También puede usar el otro comando incorporado:
helppara mostrar shell-builtin.fuente
compgen?man bash | grep -e '-A action$' -A 32que probablemente obtengas resultados como este . (aumentar / disminuir el dígito después-Ade gestionar correctamente).También puede usar el comando
whereisque 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-aopción (lista de todos los partidos), se verá queechoes tanto una orden interna del shell y un programa externo:Los dos son completamente independientes el uno del otro.
typesin opciones, simplemente devolverá el primer comando coincidente encontrado. Por lo tanto, el tipofoole 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
cates 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,execyexit. 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,califeysuper. Todos los demás comandos se pueden construir como programas integrados o externos.cates 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