Dans le manuel bash , il est écrit que
Builtin commands are contained >>> within <<< the shell itself
En outre, cette réponse indique que
A built-in command is simply a command that the shell carries out itself,
instead of interpreting it as a request to load and run some
>>> other program <<<
Quand je cours compgen -b
sur bash 4.4
, je reçois une liste de toutes les commandes SHELL. Je vois par exemple cela [
et kill
sont répertoriés comme étant des commandes intégrées au shell. Mais leurs emplacements réels sont:
/usr/bin/[
/bin/kill
Je pensais que builtin
cela signifie que la commande est compilée dans l' /bin/bash
exécutable. Alors qu'est-ce qui m'embrouille vraiment: Veuillez me corriger, mais comment une commande distincte peut-elle être une builtin
, alors qu'elle ne fait en fait pas partie du shell?
bash
shell
shell-builtin
manifestant
la source
la source
exec
pour manipuler les descripteurs de fichiers eteval
pour l'évaluation des commandes. Ils ne sont pas nécessaires en tant que commandes autonomesRéponses:
Les commandes intégrées au shell sont souvent intégrées en raison de l'augmentation des performances que cela donne. Par exemple, appeler l' externe
printf
est plus lent que d'utiliser le intégréprintf
.Étant donné que certains utilitaires n'ont pas besoin d'être intégrés, à moins qu'ils ne soient spéciaux, comme
cd
, ils sont également fournis en tant qu'utilitaires externes . Ceci afin que les scripts ne se cassent pas s'ils sont interprétés par un shell qui ne fournit pas d'équivalent intégré.Certains éléments intégrés du shell fournissent également des extensions à la commande externe équivalente. Bash
printf
, par exemple, est capable de faire(imprimer dans une variable) ce que l'externe
/usr/bin/printf
ne pourrait tout simplement pas faire car il n'a pas accès aux variables shell dans la session shell actuelle (et ne peut pas les changer).Les utilitaires intégrés n'ont pas non plus la restriction que leur ligne de commande étendue doit être plus courte qu'une certaine longueur. Faire
est donc sûr si
printf
est une commande intégrée au shell. La restriction de la longueur de la ligne de commande provient de laexecve()
fonction de bibliothèque C utilisée pour exécuter une commande externe. Si la ligne de commande et l'environnement actuel sont plus grands que lesARG_MAX
octets (voirgetconf ARG_MAX
dans le shell), l'appel àexecve()
échouera. Si l'utilitaire est intégré au shell, ilexecve()
n'est pas nécessaire de l'appeler.Les utilitaires intégrés ont priorité sur les utilitaires trouvés dans
$PATH
. Pour désactiver une commande intégrée dansbash
, utilisez par exempleIl y a une courte liste d'utilitaires qui doivent être intégrés dans un shell (extrait de la liste des standards spéciaux du standard POSIX )
Ceux-ci doivent être intégrés car ils manipulent directement l'environnement et le flux de programme de la session shell actuelle. Un utilitaire externe ne serait pas en mesure de le faire.
Fait intéressant,
cd
ne fait pas partie de cette liste, mais POSIX dit ce qui suit à ce sujet:Je suppose donc que les incorporés "spéciaux" ne peuvent pas avoir d'homologues externes, alors
cd
qu'en théorie ils auraient pu (mais cela ne ferait pas grand-chose).la source
chdir
/cd
étaient des binaires externes dans les tout premiers Unices / pré-Unix avant d'fork
être introduits./usr/bin/cd
, mais il ne changera pas réellement le répertoire de travail actuel. Son manuel dit:/usr/bin/cd
n'a aucun effet sur le processus d'appel mais peut être utilisé pour déterminer si un répertoire donné peut être défini comme répertoire courant.kill
est également agréable car il n'a pas besoin de bifurquer un autre processus, bien si vous avez atteint la limite de votre nombre de processus.Vous êtes (tout à fait compréhensible) confus par le fait que certains buildins existent à la fois en tant que buildins et en tant que commandes externes. Donc, bien que vous ayez raison, par exemple, qu'il existe une
/bin/[
commande, cela ne signifie pas que son «emplacement réel» est/bin
.Tout moyen facile de tester cela est d'exécuter
type
avec le-a
commutateur qui affichera toutes les instances disponibles d'une commande. Sur mon système Arch, cela montre:Notez que
/sbin
,/usr/sbin
et que/bin
tous les liens symboliques pointent vers/usr/bin
, il n'y a donc qu'un seul externe[
:Comme vous pouvez le voir, il
[
s'agit à la fois d'une commande intégrée et d'une commande externe, et il en va de même pour diverses autres commandes intégrées de shell. Cependant, cela ne change pas le fait qu'il s'agit également de commandes intégrées au shell, compilées dans le shell lui-même.la source
/bin/printf
est installé par lecoreutils
package et/bin/kill
parutil-linux
.