1. Qu'est-ce qu'une coquille
Le shell est le programme d'interface entre vous (l'utilisateur) et Linux (ou plus précisément, vous et le noyau Linux). Chaque commande que vous entrez à l'invite est interprétée par le shell puis transmise au noyau Linux.
Le shell est un interpréteur de langage de commande. Possède son propre jeu de commandes shell intégré. En outre, le shell peut également être appelé par d'autres utilitaires Linux et programmes d'application efficaces du système.
Chaque fois que vous tapez une commande, elle est interprétée par le shell Linux. Certaines commandes, telles que la commande d'impression du répertoire de travail courant (pwd), sont incluses dans Linux bash (tout comme les commandes internes de DOS). D'autres commandes, telles que la commande de copie (cp) et la commande de déplacement (rm), sont des programmes distincts qui existent dans un répertoire du système de fichiers. Pour l'utilisateur, vous ne savez pas (ou ne vous en souciez pas) si une commande est construite à l'intérieur du shell ou dans un programme séparé.
Le shell vérifie d'abord si la commande est une commande interne, et si ce n'est pas le cas, il vérifie s'il s'agit d'une application. L'application ici peut être un programme utilitaire de Linux lui-même, tel que ls et rm, ou un programme commercial acheté , comme xv, ou public Software (logiciel du domaine public), tout comme ghostview. Ensuite, le shell essaie de trouver ces applications dans le chemin de recherche ($ PATH). Le chemin de recherche est une liste de répertoires dans lesquels des programmes exécutables peuvent être trouvés. Si la commande que vous tapez n'est pas une commande interne et que le fichier exécutable n'est pas trouvé dans le chemin, un message d'erreur s'affiche. Et si la commande est trouvée avec succès, les commandes ou applications internes du shell seront décomposées en appels système et transmises au noyau Linux.
Une autre caractéristique importante du shell est qu'il est lui-même un langage de programmation interprété. Le langage de programmation shell prend en charge la plupart des structures de contrôle de programme visibles dans les langages de haut niveau, tels que les boucles, les fonctions, les variables et les tableaux. Le langage de programmation shell est facile à apprendre, et une fois que vous le maîtriserez, il deviendra votre outil puissant. Toute commande qui peut être saisie à l'invite peut également être placée dans un programme shell exécutable, ce qui signifie qu'une certaine tâche peut être simplement répétée dans le langage shell.
2. Comment démarrer le shell
Le shell est démarré une fois que vous vous êtes connecté avec succès au système et sera toujours votre moyen d'interagir avec le noyau système jusqu'à ce que vous vous déconnectiez. Chaque utilisateur de votre système a un shell par défaut. Le shell par défaut de chaque utilisateur est spécifié dans le fichier passwd du système et le chemin du fichier est / etc / passwd. Le fichier passwd contient également d'autres éléments: le numéro d'identification de l'utilisateur de chacun, une copie du mot de passe chiffré et le programme exécuté immédiatement après la connexion de l'utilisateur. (Remarque: afin d'améliorer la sécurité, le système actuel place généralement le mot de passe chiffré dans un autre file-shadow, et le mot de passe stocké dans passwd est remplacé par un caractère x) Bien qu'il n'y ait pas d'exigence stricte que ce programme soit un shell Linux, c'est le cas dans la plupart des cas.
3. Coques couramment utilisées
Il existe de nombreux shells différents disponibles dans les systèmes Linux et UNIX. Les plus couramment utilisés sont le shell Bourne (sh) , le shell C (csh) et le shell Korn (ksh) . Les trois coques ont leurs avantages et leurs inconvénients.
-
L'auteur du shell Bourne est Steven Bourne. C'est le shell utilisé à l'origine par UNIX et peut être utilisé sur tous les types d'UNIX. Le shell Bourne est assez bon en programmation shell, mais il n'est pas aussi bon que les autres shells pour gérer les interactions avec les utilisateurs.
-
Le shell C a été écrit par Bill Joy, et il prend davantage en compte la convivialité de l'interface utilisateur. Il prend en charge certaines fonctionnalités que le shell Bourne ne prend pas en charge, telles que l'achèvement de la ligne de commande. On pense généralement que l'interface de programmation du shell C n'est pas aussi bonne que le shell Bourne, mais le shell C est utilisé par de nombreux programmeurs C car la syntaxe du shell C est très similaire au langage C, qui en est l'origine du nom du shell C.
-
Korn shell (ksh) a été écrit par Dave Korn. Il combine les avantages du shell C et du shell Bourne et est entièrement compatible avec le shell Bourne.
En plus de ces coques, de nombreux autres programmes de coques ont absorbé les avantages de ces programmes de coques originaux et sont devenues de nouvelles coques. Les commandes couramment utilisées sous Linux sont tcsh (csh étendu) , le shell Bourne Again (bash étendu, sh) et le shell Korn du domaine public (pdksh étendu, ksh) . Bash est le shell par défaut pour la plupart des systèmes Linux.
4. Le Bourne Again Shell (bash)
Le shell Bourne Again (bash) , comme son nom l'indique, est une extension du shell Bourne. bash est entièrement rétrocompatible avec le shell Bourne, et de nombreuses fonctionnalités ont été ajoutées et améliorées sur la base du shell Bourne. Bash contient également de nombreux avantages des coques C et Korn. Bash a une interface de programmation très flexible et puissante, ainsi qu'une interface utilisateur très conviviale.
Pourquoi utiliser bash au lieu de sh? Le plus gros inconvénient du shell Bourne est qu'il gère les entrées utilisateur. La saisie de commandes dans le shell Bourne peut être fastidieuse, en particulier lorsque vous tapez de nombreuses commandes similaires. Et bash a préparé plusieurs fonctionnalités pour faciliter la saisie des commandes.
4.1 Achèvement de la ligne de commande
Habituellement, lorsque vous entrez une commande dans bash (ou dans tout autre shell), vous pouvez déterminer la commande que vous souhaitez entrer sans taper la commande dans le shell complet. Par exemple, supposons que le répertoire de travail actuel contient les fichiers et sous-répertoires suivants:
News/ bin/ games/ mail/ samplefile test/
Si vous souhaitez entrer dans le sous-répertoire test, vous entrerez la commande suivante:
cd test
Cette commande peut répondre à vos besoins, mais bash fournit également une manière légèrement différente d'accomplir la même chose. Étant donné que test est le seul sous-répertoire du répertoire en cours qui commence par la lettre t, bash peut déterminer ce que vous voulez faire après avoir entré uniquement la lettre t:
cd t
Après avoir tapé cette lettre, la seule possibilité est de tester. Si vous souhaitez que bash termine la commande pour vous, appuyez sur la touche Tab:
cd t<tab>
Lorsque vous faites cela, bash vous aidera à compléter les commandes et à les afficher à l'écran. Mais la commande n'est pas exécutée avant d'appuyer sur la touche Entrée, et bash vous permettra de vérifier si la commande terminée est ce dont vous avez vraiment besoin. Vous ne verrez peut-être pas sa valeur lorsque vous entrez une commande courte comme celle-ci, même si la commande est très courte, cela ralentira la vitesse d'entrée, mais lorsque la commande que vous voulez entrer est un peu longue, vous trouverez comment cette fonction est. Belle.
Mais que se passe-t-il quand il y a plus d'un fichier commençant par la lettre t dans le répertoire? Il y aura des problèmes lorsque vous utilisez la commande de complétion, regardons la situation suivante, le répertoire actuel a le contenu suivant:
News/ bin/ mail/ samplefile test/ tools/ working/
Il y a maintenant deux fichiers commençant par la lettre t dans ce répertoire. Supposons que vous souhaitiez toujours entrer dans le sous-répertoire de test, comment utiliser les commandes pour le compléter? Si vous tapez comme avant:
cd t<tab>
Bash ne saura pas quel sous-répertoire vous voulez entrer, car les informations fournies ne sont pas uniques. Si vous le faites, bash émettra un bip pour vous rappeler qu'il n'y a pas assez d'informations pour terminer votre commande. Après le bip, bash ne modifie pas la commande entrée. Cela vous permettra d'entrer plus d'informations sur la base d'origine. Dans cet exemple, il vous suffit de taper un e et d'appuyer à nouveau sur la touche Tabulation, puis bash sera Il y en a assez informations pour terminer votre commande:
cd test
Chaque fois que vous appuyez sur la touche Tab lorsque vous entrez une commande, bash fera de son mieux pour terminer la commande. Si cela ne fonctionne pas, il émettra un bip pour vous rappeler que vous avez besoin de plus d'informations. Vous devez taper plus de caractères et appuyer à nouveau sur Tabulation, répétez ce processus jusqu'à ce que la commande souhaitée apparaisse.
4.2 Caractère générique
Une autre façon de faciliter la saisie des commandes consiste à utiliser des caractères génériques dans la commande. bash prend en charge trois caractères génériques:
- * Correspond à n'importe quel caractère et n'importe quel nombre de caractères
- ? Correspond à n'importe quel caractère
- […] Correspond à n'importe quel caractère unique contenu entre parenthèses
* L'utilisation de jokers est un peu comme l'achèvement de commandes. Par exemple, supposons que le répertoire actuel contienne les fichiers suivants:
News/ bin/ games/ mail/ samplefile test/
Si vous voulez entrer dans le répertoire de test, vous allez taper cd test
, ou vous voulez le compléter avec la commande:
cd t<tab>
Il existe maintenant une troisième façon de faire la même chose. Comme il n'y a qu'un seul fichier commençant par la lettre t, vous pouvez également utiliser le caractère générique * pour entrer dans le répertoire. Tapez la commande suivante:
cd t*
* Correspond à n'importe quel caractère et à n'importe quel nombre de caractères, donc le shell remplacera t * par test (le seul fichier dans le répertoire courant qui correspond au schéma de caractères génériques). Il sera fiable s'il n'y a qu'un seul fichier dans le répertoire courant commençant par la lettre t. Mais s'il y a plus d'un fichier dans le répertoire courant commençant par la lettre t, le shell essaiera d'entrer le premier répertoire qui répond au schéma correspondant. Ce répertoire est le premier répertoire par ordre alphabétique. Ce répertoire peut ou non être ce que vous attendez de.
Une utilisation plus pratique du caractère générique * consiste à ajouter un caractère générique à plusieurs fichiers avec des noms similaires dans la commande que vous souhaitez exécuter. Par exemple, supposons que le répertoire actuel contienne les fichiers suivants:
ch1.doc ch2.doc ch3.doc chimp config mail/ test/ tools/
Si vous devez imprimer tous les .doc
fichiers avec l' extension , vous pouvez utiliser une commande simplifiée comme celle-ci:
lpr *.doc
Dans cet exemple, bash remplacera * .doc par tous les fichiers du répertoire courant dont les noms correspondent au schéma de caractères génériques. Une fois que bash l'a remplacé, la commande sera traitée comme:
lpr ch1.doc ch2.doc ch3.doc
La commande lpr sera appelée avec ch1.doc, ch2.doc et ch3.doc comme paramètres.
Le caractère générique? Sauf pour la correspondance d'un seul caractère, les autres fonctions sont identiques au caractère générique *. Si vous utilisez le caractère générique? Pour imprimer tous les fichiers avec l'extension .doc dans le répertoire susmentionné, tapez la commande suivante:
lpr ch?.doc
Le caractère générique [...] peut correspondre au caractère ou à la plage de caractères indiqués entre crochets. Prenez également le répertoire précédent comme exemple, pour imprimer tous les fichiers avec l'extension .doc dans ce répertoire, vous pouvez taper l'une des commandes suivantes:
lpr ch[123].doc
ou:
lpr ch[1-3].doc
4.3 Historique des commandes
4.4 Redirection d'entrée
La redirection d'entrée est utilisée pour changer la source d'entrée d'une commande. Certaines commandes nécessitent suffisamment d'informations dans la ligne de commande pour fonctionner. Par exemple, rm, vous devez indiquer à rm le fichier que vous souhaitez supprimer sur la ligne de commande. D'autres commandes nécessitent une entrée plus détaillée, et l'entrée de ces commandes peut être un fichier. Par exemple, la commande wc compte le nombre de caractères, de mots et de lignes dans les fichiers qui y sont introduits. Si vous tapez simplement wc <enter> sur la ligne de commande, wc attendra que vous lui disiez quoi compter. À ce moment, bash est comme mort, tout ce que vous tapez apparaît à l'écran, mais rien ne se passe. Cela est dû au fait que la commande wc collecte les entrées pour elle-même. Si vous appuyez sur Ctrl-D, le résultat de la commande wc sera écrit à l'écran. Si vous entrez un nom de fichier comme paramètre, comme dans l'exemple suivant, wc renverra le nombre de caractères, mots et lignes contenus dans le fichier:
wc test
11 2 1
Une autre façon de transmettre le contenu du fichier de test à la commande wc est de rediriger l'entrée de wc. Le symbole <est utilisé dans bash pour rediriger l'entrée de la commande courante vers un fichier spécifié. Vous pouvez donc utiliser la commande suivante pour rediriger l'entrée de la commande wc vers le fichier de test:
wc < test
11 2 1
La redirection d'entrée n'est pas souvent utilisée car la plupart des commandes spécifient le nom de fichier du fichier d'entrée sur la ligne de commande sous forme de paramètres. Toutefois, lorsque vous utilisez une commande qui n'accepte pas les noms de fichiers comme paramètres d'entrée et que l'entrée requise se trouve dans un fichier existant, vous pouvez utiliser la redirection d'entrée pour résoudre le problème .
4.5 Redirection de sortie
La redirection de sortie est plus couramment utilisée que la redirection d'entrée. La redirection de sortie vous permet de rediriger la sortie d'une commande vers un fichier au lieu de l'afficher à l'écran.
Cette fonctionnalité peut être utilisée dans de nombreux cas. Par exemple, si la sortie d'une certaine commande est trop importante pour être entièrement affichée à l'écran, vous pouvez la rediriger vers un fichier, puis utiliser un éditeur de texte pour ouvrir le fichier plus tard; également lorsque vous souhaitez enregistrer la sortie de une commande Cette méthode peut être utilisée. De plus, la redirection de sortie peut être utilisée lorsque la sortie d'une commande est utilisée comme entrée d'une autre commande. (Il existe également un moyen plus simple d'utiliser la sortie d'une commande comme entrée d'une autre commande, qui consiste à utiliser des tubes. L'utilisation de tubes sera présentée dans la section "Tube" de cet article)
L'utilisation de la redirection de sortie est très similaire à la redirection d'entrée, mais le symbole de la redirection de sortie est>.
Remarque: La meilleure façon de mémoriser les symboles de redirection d'entrée / sortie est de considérer <comme un entonnoir, et la petite bouche de l'entonnoir pointe vers les commandes qui doivent être entrées (car les commandes qui doivent être entrées seront sur le côté gauche de <), et> comme une grande bouche pointe vers un entonnoir avec des commandes de sortie.
Pour un exemple de redirection, lorsque vous souhaitez enregistrer la sortie de la commande ls dans un fichier nommé directory.out, vous pouvez utiliser la commande suivante:
ls > directory.out
4.6 Tuyauterie
Les tuyaux peuvent connecter une série de commandes. Cela signifie que la sortie de la première commande sera redirigée vers la deuxième commande et utilisée comme entrée de la deuxième commande, la sortie de la deuxième commande sera utilisée comme entrée de la troisième commande , et ainsi de suite. La sortie sera la dernière commande dans le pipe line est affichée à l'écran (si la ligne de commande utilise la redirection de sortie, il mettra un fichier).
Vous pouvez créer un pipe line en utilisant le symbole pipe |. L'exemple suivant est une pipe line:
cat sample.text | grep "High" | wc -l
ce pipe enverra la sortie de la commande cat (lister le contenu d'un fichier) à la commande grep. La commande grep recherche le mot High dans l'entrée. La sortie de la commande grep est constituée de toutes les lignes contenant le mot High. Cette sortie est envoyée à la commande wc. La commande wc avec l'option -l comptera le nombre de lignes dans l'entrée. Supposons que le contenu de sample.txt soit le suivant:
Things to do today:
Low: Go grocery shopping
High: Return movie
High: Clear level 3 in Alien vs. Predator
Medium: Pick up clothes from dry cleaner
Le pipeline renverra le résultat 2, indiquant que vous avez deux choses très importantes à faire aujourd'hui:
cat sample.text | grep "High" | wc -l
2
4.7 Invite
Bash a deux niveaux d'invites utilisateur. Le premier niveau est l'invite que vous voyez souvent lorsque bash attend une entrée de commande. L'invite de premier niveau par défaut est le caractère $ (s'il s'agit d'un super utilisateur, c'est le signe #). Vous pouvez modifier votre invite par défaut en modifiant la valeur de la variable PS1 dans bash, par exemple:
PS1="Please enter a command"
Remplacez l'invite du shell bash par la chaîne spécifiée.
Affiche une invite de deuxième niveau lorsque bash s'attend à entrer plus d'informations pour terminer la commande. L'invite de deuxième niveau par défaut est>. Si vous souhaitez modifier l'invite de deuxième niveau, vous pouvez le faire en définissant la valeur de la variable PS2:
PS2="I need more information"
En outre, vous pouvez également utiliser des caractères spéciaux pour définir votre invite. La liste suivante répertorie les caractères spéciaux les plus couramment utilisés.
personnage | sens |
---|---|
/! | Affichez le numéro d'enregistrement de l'historique de la commande. |
/ # | Afficher le numéro de commande de la commande en cours. |
/ $ | Affichez le signe $ comme invite, si l'utilisateur est root, le signe # s'affiche. |
// | Afficher les barres obliques inverses. |
/ré | Affichez la date actuelle. |
/ h | Affichez le nom d'hôte. |
/ n | Imprimez une nouvelle ligne. |
/ nnn | Affichez la valeur octale de nnn. |
/ s | Affiche le nom du shell en cours d'exécution. |
/ t | Affichez l'heure actuelle. |
/ u | Affichez le nom d'utilisateur de l'utilisateur actuel. |
/ W | Afficher le nom du répertoire de travail actuel. |
/ w | Affichez le chemin du répertoire de travail actuel. |
Ces caractères spéciaux peuvent être combinés dans de nombreux schémas d'invite utiles (ou ils peuvent être combinés dans des schémas très étranges). Par exemple, définissez PS1 sur:
PS1="/t"
Cela provoque l'invite pour afficher l'heure actuelle comme indiqué ci-dessous (il n'y aura pas d'espace après l'invite):
02:16:15
Et les paramètres suivants:
PS1=/t
Cela rendra l'invite suivante:
t
Cela montre l'importance des guillemets dans les paramètres, la chaîne d'invite suivante:
PS1="/t// "
Fera ressembler l'invite à ceci:
02:16:30/
Dans ce cas, il y aura un espace après l'invite car il y a un espace entre les guillemets.
4.8 Contrôle des travaux
Le contrôle des travaux peut contrôler le comportement du processus en cours d'exécution. En particulier, vous pouvez suspendre un processus en cours et reprendre son fonctionnement plus tard. Bash garde une trace de tous les processus démarrés. Vous pouvez suspendre ou reprendre un processus en cours à tout moment pendant sa durée de vie.
Appuyez sur Ctrl-Z pour suspendre un processus en cours. La commande bg fait reprendre l'exécution d'un processus suspendu en arrière-plan, tandis que la commande fg fait reprendre l'exécution du processus au premier plan. Ces commandes sont souvent utilisées lorsque l'utilisateur veut s'exécuter en arrière-plan et le mettre accidentellement au premier plan. Lorsqu'une commande est exécutée au premier plan, elle interdira à l'utilisateur d'interagir avec le shell jusqu'à la fin de la commande. Cela ne pose généralement aucun problème, car la plupart des commandes sont exécutées rapidement. Si la commande que vous souhaitez exécuter prend beaucoup de temps, nous la mettons généralement en arrière-plan afin de pouvoir continuer à saisir d'autres commandes au premier plan. Par exemple, si vous entrez cette commande:
command find / -name "test" > find.out
Il recherchera un fichier nommé test dans tout le système de fichiers et enregistrera le résultat dans un fichier nommé fing.out. S'il est exécuté au premier plan, selon la taille du système de fichiers, votre shell sera indisponible pendant plusieurs secondes, voire plusieurs minutes. Si vous ne le souhaitez pas, vous pouvez saisir les informations suivantes:
control-z
bg
La commande find est d'abord suspendue, puis continue à être exécutée en arrière-plan et vous pouvez immédiatement revenir à bash.