'Cat' est-il un shell intégré ou un programme externe?

33

Lorsque j'utilise la typecommande pour savoir s'il cats'agit d'un programme shell intégré ou externe, j'obtiens le résultat ci-dessous:

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

Cela signifie-t-il qu'il cats'agit d'un programme externe /bin/cat?

J'ai été dérouté, parce que quand j'ai vérifié la sortie ci-dessous, echoj'ai vu que c'était built-inun programme mais aussi un programme./bin/echo

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

Donc, je ne pouvais pas utiliser la logique qui /bin/catsignifie nécessairement un programme externe, parce que l'écho était /bin/echotout de même intégré.

Alors, comment puis-je savoir ce qui catest? Intégré ou externe?

sps
la source
1
-La commande cat est un programme externe qui fait partie du système. Par conséquent, les nombreuses actions qu’il peut effectuer ne sont pas simples.
Joke Sr. OK
12
type whichpourrait vous donner la réponse pourquoi whichne pas vous donner la réponse.
Dubu
1
Dépend du shell que vous utilisez
nsn
6
Fait amusant: les deux catet lssont / ont été écrits par Stallman lui-même. Vous seriez surpris de voir combien de choses il a écrites. N'oubliez pas qu'il a écrit les premières versions du compilateur qui est aujourd'hui le meilleur compilateur au monde compilant TOUT et la plupart des utilitaires principaux. Just sayin '
Alec Teal
2
@AlecTeal Vous réalisez que la plupart des systèmes Unix utilisent des versions de ls et de chat antérieures aux versions GNU dans lesquelles Richard Stallman avait un rôle à jouer?
Ross Ridge

Réponses:

59

typevous dit ce que le shell utiliserait. Par exemple:

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

Cela signifie que si vous tapez à l’invite bash echo, vous obtiendrez le code intégré. Si vous spécifiez le chemin, comme dans /bin/echo, vous obtiendrez la commande externe.

which, en revanche, est un programme externe qui n’a aucune connaissance particulière de ce que fera le shell. Sur les systèmes de type debian, whichun script shell cherche le fichier exécutable dans le PATH. Ainsi, il vous donnera le nom de l'exécutable externe même si le shell utiliserait un script intégré.

Si une commande est uniquement disponible en version intégrée, whichrien ne retournera:

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

Maintenant, regardons cat:

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

cat est un exécutable externe, pas un shell intégré.

John1024
la source
5
Vous pourriez type -all echotrouver (dans l'ordre) quels sont les différents "échos" connus du shell (le premier étant celui que le shell appellera, si vous ne spécifiez pas quelque chose pour changer l'ordre, comme invoquer "echo"ou \echo, ou command echo)
Olivier Dulac
Bonne réponse. Un ajout: il existe deux versions de echopour des raisons historiques. Il a commencé comme une commande externe, puis a été ajouté en tant que commande intégrée. Les premières versions du shell Bourne ( /bin/sh) ne l'avaient pas. /bin/echoa été gardé pour la compatibilité, puisque toutes sortes de choses en dépendaient. (La même chose s’est produite avec test.)
alexis
Note latérale: whichelle - même peut être une coquille intégrée dans la commande, par exemple en tcsh:which which which: shell built-in command.
Dan Cornilescu
J'arrive en retard à la fête, mais pourquoi ne pas consulter sa page de manuel et vous pouvez réellement voir le nombre entre parenthèses, ce qui indique s'il s'agit d'un shell intégré ou autre
poz2k4444 le
46

cat is hashed (/bin/cat)est juste comme cat is /bin/cat(c'est, c'est un programme externe ).

La différence est que vous avez déjà couru cat cette session. Bash l'a donc déjà consultée $PATHet stockée dans une table de hachage afin de ne pas avoir à la rechercher à nouveau dans cette session.

Pour voir toutes les commandes qui ont été hachées dans votre session, exécutez 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
la source
9
En fait, à mon avis, c’est la seule réponse qui réponde à votre question :)
André Chalella
IMHO ceci ^^^ est vrai. Cette réponse devrait être celle acceptée.
LinuxSecurityFreak
4

Une autre façon de vérifier la liste des fonctions intégrées au shell: Utilisation de l’ compgenenveloppe elle-même!

La commande suivante répertorie toutes les commandes intégrées au shell:

compgen -b

Vous pouvez vérifier cat, echoen criant comme: -

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

Vous pouvez voir les compgen -b | grep catretours sans sortie, le moyen catn'est pas intégré au shell .

Visitez une liste d’options utiles fournies parcompgen .


Vous pouvez également utiliser une autre commande intégrée: helppour afficher les modifications intégrées au shell.

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.
Pandya
la source
Je ne trouve pas de documentation officielle sur ces options, savez-vous où elle existe?
Random832
@ Random832 parlez-vous des options compgen?
Pandya
oui, je n'ai rien trouvé dans la page de manuel Bash sur ce que signifie -b ou la moitié des autres options. Trouvé plus tard à gnu.org/software/bash/manual/html_node/…
Random832
@ Random832 essayez man bash | grep -e '-A action$' -A 32vous obtenez probablement une sortie comme celle-ci . (augmenter / diminuer chiffre après -Apour gérer correctement).
Pandya
4

Vous pouvez également utiliser la commande la whereisplus efficace car elle indique où se trouve la commande sur la machine, ainsi que la bibliothèque de pages de manuel, etc.

Joke Sr. OK
la source
-Excuse-moi pour mon mauvais anglais, parce que je viens d'apprendre encore et pas si bon en utilisant! ...
Joke Sr. OK
2

D'autres ont déjà répondu à propos cat, je voudrais juste expliquer le problème avec echo. Si vous utilisez l' -aoption type ( listez toutes les correspondances), vous verrez qu'il echos'agit à la fois d' un shell intégré et d' un programme externe:

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

Les deux sont complètement indépendants l'un de l'autre. typesans option retournera simplement la première commande correspondante trouvée. Donc, tapez foovous montrera ce qui sera exécuté si vous courez foo. Il peut y avoir d'autres options, mais celles-ci ne seront pas affichées à moins que vous ne les utilisiez -a.

terdon
la source
2

Puisqu'il y a plusieurs bonnes réponses ici sur l'utilisation de type pour savoir si une commande telle que catest un programme intégré ou externe. Je vais adopter une approche plus générale. Certaines commandes doivent être intégrées car elles affectent le shell actuel. Trois exemples classiques sont cd, execet exit. Certaines commandes ne doivent pas être intégrées, car leur fonctionnalité dépend du comportement de l'exécutable ou des appels système. Des exemples de tels programmes comprennent su, sudo, califeet super. Toutes les autres commandes peuvent être construites en tant que programmes intégrés ou externes.catC’est un excellent exemple de programme de cette classe, car certains coquillages l’incluent en tant que programmes intégrés et d’autres non. Il est à noter que de nombreuses commandes de cette classe disponibles en tant que commandes intégrées sont également disponibles en tant que programmes externes.

Hildred
la source