web-dev-qa-db-fra.com

Quelle est la différence entre une commande intégrée et une personne qui n'est pas?

Y a-t-il une différence intrinsèque entre une commande intégrée et une autre commande qui peut nommer la même chose?

par exemple. Les cométies sont-ils des produits "spéciaux"? ... Y a-t-il moins de frais généraux? .. Ou sont-ils simplement "construits"; Comme le tableau de bord de votre voiture?

... et existe-t-il une liste définitive (actuelle) de ces cométiches?

72
Peter.O

Il existe trois niveaux d'utilitaires intégrés:

  • certains utilitaires Faites vraiment partie de la coque comme langage de programmation, même si elles ne sont pas mots réservés . Ce sont des utilitaires de contrôle de contrôle (., :, break, continue, return, trap, exit, exec, eval), Utilitaires liés aux paramètres (set, unset, shift, export, readonly, local¹, typeset¹), Utilities alias (alias², unalias²) et times³. Ceux-ci (( spécial intégré Traitement spécial:

    • Si vous transmettez les mauvais arguments à un intégré spécial, la coquille elle-même peut annuler, plutôt que de simplement sauter à la commande suivante après avoir affiché un message d'erreur.
    • La syntaxe de pré-affectation foo=bar utility a une signification différente: c'est une attribution de paramètres ordinaire (c'est-à-dire équivalent à foo=bar; utility), au lieu d'attribuer à l'environnement pendant la durée de l'utilité.
  • Certains utilitaires ont besoin à mettre en œuvre à l'intérieur de la coquille car ils agissent sur les paramètres internes de la coque. Ceci comprend:

    • utilitaires qui agissent sur le répertoire actuel de la coquille telle que cd, dirs, pushd, popd;
    • utilitaires de contrôle de travail telles que bg, disown, fg, jobs, wait;
    • utilitaires qui lisent ou manipulent d'autres attributs shell tels que builtin, command, hash, read, type, ulimit, umask;
    • utilitaires liées aux fonctionnalités interactives, quand elles sont présentes, telles que fc, history, bind.
  • Certains utilitaires sont généralement implémentés comme des performances intégrées purement : echo, printf, test, true, false.

Les coquilles avancées telles que Bash , ksh et ZSH ont généralement plus de construction, souvent pour mettre en œuvre des caractéristiques non standard (généralement pour l'interaction). Le manuel de chaque shell vous indiquera quelles commandes sont intégrées, bien que certaines coquilles ( ZSH , au moins) prennent en charge des modules de chargement dynamique chargés de manière dynamique.

¹ Inconnu de POSIX, mais spécial dans KSH et plusieurs autres obus.
[.____] ² Ordinaire à Posix, mais spécial dans KSH et plusieurs autres obus.
[.____] ³ Dans ksh, times est une enveloppe autour du time Mot-clé: C'est un alias pour { { time;} 2>&1;}. Notez que POSIX permet à time d'être un utilitaire externe avec une analyse ordinaire ou un mot clé qui s'applique à un pipeline entier (ce qui est en ksh, bash dans ZSH).

Une intégrée est une commande fournie par la coque, plutôt que par un programme externe. Voici les listes de bash 's comités (ils sont également répertoriés dans la page Bash Man) et zsh' S comités de construction . ksh fournit une liste en exécutant builtin.

Pour savoir si une commande particulière est une intégrée, vous pouvez exécuter type command. Essayer type for et type ls Pour voir cela.

10
Shawn J. Goff

Chaque distribution et shell ont une collection différente de commandes VS Construits Shell Fonctions. En règle générale, l'idée est que les coquillages construisent les fonctions les plus courantes et les plus simples pour gagner du temps, de la rapidité et d'intégrer la volonté avec le reste de leur ensemble de fonctionnalités. Les frais généraux sont beaucoup plus bas car il n'est pas nécessaire de lancer un autre processus système. Cependant, il est possible de mélanger et de faire correspondre. Vous pouvez exécuter une coquille qui a une construisie pour quelque chose, mais que cette commande a également une commande sur votre système. Habituellement, la construction prendrait la priorité, mais vous pourriez contrôler cela.

Vous pouvez facilement savoir si une commande spécifique est une intégrée ou non en exécutant type mycommand. La plupart des pages de Homme Shell ont également une liste de leurs produits.

Edit : Utilisez type _ Pour savoir si une commande est intégrée, et si ce n'est pas which pour savoir où il sera exécuté.

1
Caleb