Lorsque j'utilise la type
commande pour savoir s'il cat
s'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 cat
s'agit d'un programme externe /bin/cat
?
J'ai été dérouté, parce que quand j'ai vérifié la sortie ci-dessous, echo
j'ai vu que c'était built-in
un 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/cat
signifie nécessairement un programme externe, parce que l'écho était /bin/echo
tout de même intégré.
Alors, comment puis-je savoir ce qui cat
est? Intégré ou externe?
type which
pourrait vous donner la réponse pourquoiwhich
ne pas vous donner la réponse.cat
etls
sont / 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 'Réponses:
type
vous dit ce que le shell utiliserait. Par exemple: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,which
un 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,
which
rien ne retournera:Maintenant, regardons
cat
:cat
est un exécutable externe, pas un shell intégré.la source
type -all echo
trouver (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
, oucommand echo
)echo
pour 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/echo
a été gardé pour la compatibilité, puisque toutes sortes de choses en dépendaient. (La même chose s’est produite avectest
.)which
elle - même peut être une coquille intégrée dans la commande, par exemple en tcsh:which which
which: shell built-in command.
cat is hashed (/bin/cat)
est juste commecat 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$PATH
et 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
la source
Une autre façon de vérifier la liste des fonctions intégrées au shell: Utilisation de l’
compgen
enveloppe elle-même!La commande suivante répertorie toutes les commandes intégrées au shell:
Vous pouvez vérifier
cat
,echo
en criant comme: -Vous pouvez voir les
compgen -b | grep cat
retours sans sortie, le moyencat
n'est pas intégré au shell .Visitez une liste d’options utiles fournies par
compgen
.Vous pouvez également utiliser une autre commande intégrée:
help
pour afficher les modifications intégrées au shell.la source
compgen
?man bash | grep -e '-A action$' -A 32
vous obtenez probablement une sortie comme celle-ci . (augmenter / diminuer chiffre après-A
pour gérer correctement).Vous pouvez également utiliser la commande la
whereis
plus efficace car elle indique où se trouve la commande sur la machine, ainsi que la bibliothèque de pages de manuel, etc.la source
D'autres ont déjà répondu à propos
cat
, je voudrais juste expliquer le problème avececho
. Si vous utilisez l'-a
option type ( listez toutes les correspondances), vous verrez qu'ilecho
s'agit à la fois d' un shell intégré et d' un programme externe:Les deux sont complètement indépendants l'un de l'autre.
type
sans option retournera simplement la première commande correspondante trouvée. Donc, tapezfoo
vous montrera ce qui sera exécuté si vous courezfoo
. Il peut y avoir d'autres options, mais celles-ci ne seront pas affichées à moins que vous ne les utilisiez-a
.la source
Puisqu'il y a plusieurs bonnes réponses ici sur l'utilisation de type pour savoir si une commande telle que
cat
est 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 sontcd
,exec
etexit
. 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 comprennentsu
,sudo
,calife
etsuper
. Toutes les autres commandes peuvent être construites en tant que programmes intégrés ou externes.cat
C’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.la source