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.com
et 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, bash
les commandes intégrées de sont listées au chapitre 4 de son manuel ). La type
commande peut vous dire si une commande est intégrée (si votre shell est compatible POSIX), car POSIX nécessite que ce type
soit un composant intégré. S'il which
ne fait pas partie de votre shell, il ne sera probablement pas au courant de ses intégrations, mais recherchera simplement des programmes externes.
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
²) ettimes
³. Ces modules intégrés spéciaux bénéficient d'un traitement spécial:foo=bar utility
a 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:
cd
,dirs
,pushd
,popd
;bg
,disown
,fg
,jobs
,wait
;builtin
,command
,hash
,read
,type
,ulimit
,umask
;fc
,history
,bind
.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
,times
enveloppe letime
mot clé: c'est un alias pour{ { time;} 2>&1;}
. Notez que POSIX permettime
d’ê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).la source
while IFS= read -r line
?read
n'est pas une commande spéciale, vous ne devez donc définirIFS=read
la variable que pour la durée de la commande.Une commande intégrée est une commande fournie par le shell plutôt que par un programme externe. Voici les listes pour
bash
les commandes intégrées de ' (elles sont également répertoriées dans la page de manuel bash) etzsh
les commandes intégrées de' .ksh
fournit une liste en cours d'exécutionbuiltin
.Pour savoir si une commande particulière est une commande intégrée, vous pouvez exécuter
type command
. Essayeztype for
ettype ls
de voir cela.la source
type
semble 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 demainChaque 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
type
pour savoir si une commande est une commande interne, sinonwhich
pour savoir où il sera exécuté à partir.la source
=>"/bin/echo" and
type d'écho echo=>"echo is a shell builtin", but 'which dd
=> "/ bin / dd" ettype dd
=> "dd est / bin / dd" ... alors, je suis à mi-chemin ....type
c’est le meilleur indicateur de ce qui est exécuté, mais vous remarquerez qu’ilecho
s’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é.which
n’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 cetype
soit une commande intégrée, de sorte qu'il soit toujours au courant des opérations intégrées.which
àtype
ou d' un ensemble d'options par exemplealias which='type -path'
- cela pourrait être la source de confusion.which
soit remplacé partype
. J'ai utilisé ce qui, encore et encore, ne sachant pastype
et j'étais très étonné de comprendre, c'estwhich
juste, si décider entre des programmes.