¿Es 'cat' un shell incorporado o un programa externo?

33

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?

sps
fuente
1
-El comando cat es un programa externo que forma parte del sistema, ya que las numerosas acciones que puede realizar no son simples.
Broma Sr. OK
12
type whichpodría darle la respuesta por qué whichno le dará la respuesta.
Dubu
1
Depende del shell que esté utilizando
nsn
66
Dato curioso: ambos caty lsson / 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 digo
Alec Teal
2
@AlecTeal ¿Te das cuenta de que la mayoría de los sistemas Unix usan versiones de ls y cat que son anteriores a las versiones de GNU en las que Richard Stallman tuvo una mano?
Ross Ridge

Respuestas:

59

typete dice qué usaría el shell. Por ejemplo:

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

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:

$ type help
help is a shell builtin
$ which help
$ 

Ahora, echemos un vistazo a cat:

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat es un ejecutable externo, no un shell incorporado.

John1024
fuente
55
Podría 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, o command echo)
Olivier Dulac
Buena respuesta. Una adición: hay dos versiones de 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ó con test.)
alexis
Nota al margen: en whichsí mismo puede ser un cmd incorporado en el shell, por ejemplo en tcsh:which which which: shell built-in command.
Dan Cornilescu
Estoy llegando tarde a la fiesta, pero ¿por qué no comprobar su página de hombre y en realidad se puede ver el número entre paréntesis, que indica si se trata de una cáscara integrada o lo que sea
poz2k4444
46

cat is hashed (/bin/cat)es igual que cat 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 hash

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin
André Chalella
fuente
99
En realidad, en mi opinión, esta es la única respuesta que responde a su pregunta :)
André Chalella
En mi humilde opinión esto ^^^ es cierto. Esta respuesta debe ser la aceptada.
LinuxSecurityFreak
4

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:

compgen -b

Puede verificarlo cat, echomediante greping como: -

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

Puede ver compgen -b | grep catdevoluciones sin salida, significa catque 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.

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.
Pandya
fuente
No puedo encontrar ninguna documentación formal para estas opciones, ¿sabes dónde existe?
Random832
@ Random832 ¿estás hablando de opciones para compgen?
Pandya
sí, no pude encontrar nada en la página de manual de Bash sobre lo que significa la mitad de las otras opciones. Lo encontré más tarde en gnu.org/software/bash/manual/html_node/…
Random832
@ Random832 intenta man bash | grep -e '-A action$' -A 32que probablemente obtengas resultados como este . (aumentar / disminuir el dígito después -Ade gestionar correctamente).
Pandya
4

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.

Broma Sr. OK
fuente
-Disculpe por mi mal inglés, ¡porque todavía estoy aprendiendo y no soy tan bueno usando! ...
Broma Sr. OK
2

Otros ya han respondido sobre cat, solo me gustaría explicar el problema con echo. Si utiliza su tipo de -aopción (lista de todos los partidos), se verá que echoes tanto una orden interna del shell y un programa externo:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

Los dos son completamente independientes el uno del otro. typesin opciones, simplemente devolverá el primer comando coincidente encontrado. Por lo tanto, el tipo foole mostrará lo que se ejecutará si ejecuta foo. Puede haber otras opciones, pero no se mostrarán a menos que las use -a.

terdon
fuente
2

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 son cd, execy exit. 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 incluyen su, sudo, califey super. 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.

hildred
fuente