Quelle est la différence entre une commande intégrée et une autre?

72

Existe-t-il une différence intrinsèque entre une commande intégrée et une autre commande pouvant nominalement faire la même chose?

par exemple. Est-ce que les internes reçoivent un traitement "spécial"? ... Y a-t-il moins de frais généraux à leur fonctionnement? .. ou sont-ils simplement «intégrés»; comme le tableau de bord de votre voiture?

... et existe-t-il une liste définitive (actuelle) de ces tâches intégrées?

Peter.O
la source

Réponses:

90

D'après vos commentaires, vous semblez ne pas savoir exactement ce qu'est un shell . Le noyau est responsable de la gestion du système. C'est la partie qui charge et exécute les programmes, accède aux fichiers, alloue de la mémoire, etc. Mais le noyau n'a pas d'interface utilisateur; vous ne pouvez communiquer avec elle qu'en utilisant un autre programme en tant qu'intermédiaire.

Un shell est un programme qui imprime une invite, lit une ligne d’entrée, puis l’interprète comme une ou plusieurs commandes permettant de manipuler des fichiers ou d’exécuter d’autres programmes. Avant l'invention de l'interface graphique, le shell était l'interface utilisateur principale d'un système d'exploitation. Sous MS-DOS, le shell a été appelé command.comet peu de personnes ont déjà essayé d’en utiliser un autre. Sous Unix, cependant, il y avait longtemps que plusieurs utilisateurs pouvaient choisir.

Ils peuvent être divisés en 3 types. Les shells compatibles Bourne utilisent la syntaxe dérivée du shell Bourne d' origine . Les shells C utilisent la syntaxe du shell C d' origine . Ensuite, il y a des shells non traditionnels qui inventent leur propre syntaxe, ou en empruntent une à un langage de programmation, et sont généralement beaucoup moins populaires que les deux premiers types.

Une commande intégrée est simplement une commande que le shell exécute elle-même, au lieu de l'interpréter comme une demande de chargement et d'exécution d'un autre programme. Cela a deux effets principaux. Tout d’abord, c’est généralement plus rapide, car charger et exécuter un programme prend du temps. Bien entendu, plus la commande est longue à exécuter, moins le temps de chargement est significatif par rapport au temps d'exécution total (car le temps de chargement est relativement constant).

Deuxièmement, une commande intégrée peut affecter l'état interne du shell. C'est pourquoi les commandes telles que cd doivent être intégrées, car un programme externe ne peut pas changer le répertoire en cours du shell. D'autres commandes, telles que echo, peuvent être intégrées pour plus d'efficacité, mais il n'y a aucune raison intrinsèque pour lesquelles elles ne peuvent pas être des commandes externes.

Les commandes intégrées dépendent du shell que vous utilisez. Vous devrez consulter sa documentation pour obtenir une liste (par exemple, bashles commandes intégrées de sont listées au chapitre 4 de son manuel ). La typecommande peut vous dire si une commande est intégrée (si votre shell est compatible POSIX), car POSIX nécessite que ce typesoit un composant intégré. S'il whichne fait pas partie de votre shell, il ne sera probablement pas au courant de ses intégrations, mais recherchera simplement des programmes externes.

cjm
la source
Les applications communiquent avec le noyau en émettant des interruptions.
Nathan Osman
11
@ George: Les applications communiquent avec le noyau en émettant des appels système qui, selon le système d'exploitation et l'architecture, peuvent utiliser ou non des interruptions. En règle générale, les utilisateurs n'émettent aucune interruption.
Gilles 'SO- arrête d'être méchant'
2
@ cjm: Quand vous l'expliquez de cette manière, cela semble si simple:)… vous avez certainement contribué à éliminer le brouillard… juste une légère brume à présent… (en fait, c'est le temps qu'il fait ici, ce matin. .. agréablement brumeux;) ... merci
Peter.O
@ Gilles: Vraiment? Je pensais que tous les programmes en mode utilisateur communiquaient avec le noyau via des interruptions (sur certaines architectures, bien sûr).
Nathan Osman
2
@cjm Réponse très complète et instructive. J'ai beaucoup appris à le lire. :)
ankush981
37

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

  • Certains utilitaires font vraiment partie du shell en tant que langage de programmation, même s'ils ne sont pas des mots réservés . Ils sont des utilitaires de contrôle de flux ( ., :, break, continue, return, trap, exit, exec, eval), divers utilitaires paramètres ( set, unset, shift, export, readonly, local¹, typeset¹), les services publics d'alias ( alias², unalias²) et times³. Ces modules intégrés spéciaux bénéficient d'un traitement spécial:

    • Si vous transmettez les mauvais arguments à une commande intégrée spéciale, le shell lui-même risque d'abandonner, au lieu de passer directement à la commande suivante après l'affichage d'un message d'erreur.
    • La syntaxe de pré-affectation foo=bar utilitya une signification différente: il s'agit d'une assignation de paramètre ordinaire (c'est-à-dire équivalente à foo=bar; utility), au lieu d'attribuer à l'environnement uniquement pour la durée de l'utilitaire.
  • Certains utilitaires doivent être implémentés à l'intérieur du shell car ils agissent sur les paramètres internes du shell. Ceci comprend:

    • les services publics qui agissent sur le répertoire courant du shell tels que cd, dirs, pushd, popd;
    • utilitaires de contrôle de travaux tels que bg, disown, fg, jobs, wait;
    • utilitaires qui lisent ou manipuler d' autres attributs d'enveloppe tels que builtin, command, hash, read, type, ulimit, umask;
    • les services publics liés à des fonctions interactives, quand ils sont présents, tels que fc, history, bind.
  • Certains services publics sont généralement mises en œuvre Encastrements uniquement pour la performance : echo, printf, test, true, false.

Les shells avancés tels que bash , ksh et zsh ont généralement plus de fonctionnalités intégrées, souvent pour implémenter des fonctionnalités non standard (généralement pour l'interaction). Le manuel de chaque shell vous indiquera quelles commandes sont intégrées, bien que certains shells ( au moins, zsh ) prennent en charge des modules chargeables de manière dynamique qui peuvent fournir davantage de fonctions intégrées.

¹ Inconnu pour POSIX, mais spécial en ksh et plusieurs autres obus.
² Ordinaire dans POSIX, mais spécial dans ksh et plusieurs autres obus.
³ In ksh, timesenveloppe le timemot clé: c'est un alias pour { { time;} 2>&1;}. Notez que POSIX permet timed’être un utilitaire externe avec une analyse ordinaire ou un mot clé qui s’applique à tout un pipeline (qu’il soit en ksh, bash en zsh).

Gilles, arrête de faire le mal
la source
3
Ces distinctions sont les plus importantes.
dmckee
Question rapide, que veut dire "paramétrage ordinaire" quand on le fait while IFS= read -r line?
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy readn'est pas une commande spéciale, vous ne devez donc définir IFS=readla variable que pour la durée de la commande.
Gilles 'SO- arrête d'être méchant'
10

Une commande intégrée est une commande fournie par le shell plutôt que par un programme externe. Voici les listes pour bashles commandes intégrées de ' (elles sont également répertoriées dans la page de manuel bash) et zshles commandes intégrées de' . kshfournit une liste en cours d'exécution builtin.

Pour savoir si une commande particulière est une commande intégrée, vous pouvez exécuter type command. Essayez type foret type lsde voir cela.

Shawn J. Goff
la source
typesemble faire l'affaire; merci pour cela ... mais je me demande encore ce que signifie "fourni par le shell" ... Peut-être dois-je mieux comprendre le rapport entre le shell et le noyau ... mais pas à 2 heures du matin ... je viendrai retour à ce demain
Peter.O
1

Chaque distribution et chaque shell a une collection différente de commandes par rapport aux fonctions de shell intégrées. Généralement, l’idée est que les coques intègrent les fonctions les plus courantes et les plus simples pour gagner du temps, gagner de la rapidité, et intègrent la volonté au reste de leur ensemble de fonctionnalités. Les frais généraux sont beaucoup plus faibles car il n'est pas nécessaire de lancer un autre processus système. Cependant, il est possible de mélanger et assortir. Vous pouvez exécuter un shell ayant une construction, mais également cette commande sur votre système. Généralement, la commande intégrée est prioritaire, mais vous pouvez contrôler cela.

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

Edit: Utilisez typepour savoir si une commande est une commande interne, sinon whichpour savoir où il sera exécuté à partir.

Caleb
la source
@Caleb: merci pour votre commentaire, mais cela me laisse perplexe sur ce qu'est exactement un "processus système". Je continue à voir des références à cette époque, mais je ne comprends pas où réside la distinction ... (en fait je ne peux pas voyez comment 'quel' est un indicateur absolu) .. par exemple .. 'quel =>"/bin/echo" and type d'écho echo =>"echo is a shell builtin", but 'which dd=> "/ bin / dd" et type dd=> "dd est / bin / dd" ... alors, je suis à mi-chemin ....
Peter.O
"System procses" signifie simplement qu'il est démarré en tant qu'application indépendante gérée par le noyau. L'alternative dans le cas des commandes intégrées consiste simplement à exécuter une sous-fonction dans le code en cours d'exécution de votre shell. Dans l’exemple que vous donnez, typec’est le meilleur indicateur de ce qui est exécuté, mais vous remarquerez qu’il echos’agit à la fois d’une fonction intégrée et d’une application portant ce nom. Si votre shell n'a pas intégré le système, vous serez exécuté.
Caleb
2
whichn’est pas nécessairement une commande intégrée, et si ce n’est pas le cas, il ne saura rien de l’intégration du shell. POSIX nécessite que ce typesoit une commande intégrée, de sorte qu'il soit toujours au courant des opérations intégrées.
cjm
De nombreux systèmes sont livrés avec un alias whichà typeou d' un ensemble d'options par exemple alias which='type -path'- cela pourrait être la source de confusion.
Random832
1
Je ne peux pas voter cela jusqu'à ce qu'il whichsoit remplacé par type. J'ai utilisé ce qui, encore et encore, ne sachant pas typeet j'étais très étonné de comprendre, c'est whichjuste, si décider entre des programmes.
Utilisateur inconnu