Linux - Le shell


Introduction au shell

L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille».
Le shell, une coquille entre l\'OS et l\'utilisateur
Le shell est ainsi chargé de faire l'intermédiaire le système d'exploitation et l'utilisateur grâce aux lignes de commandes saisies par ce dernier. Son rôle consiste ainsi à lire la ligne de commande, interpréter sa signification, exécuter la commande, puis retourner le résultat sur les sorties.
Le shell est ainsi un fichier exécutable chargé d'interpréter les commandes, de les transmettre au système et de retourner le résultat. Il existe plusieurs shells, les plus courants étant sh (appelé «Bourne shell»), bash («Bourne again shell»), csh («C Shell»), Tcsh («Tenex C shell»), ksh («Korn shell») et zshZero shell»). Leur nom correspond généralement au nom de l'exécutable.
Chaque utilisateur possède un shell par défaut, qui sera lancé à l'ouverture d'une invite de commande. Le shell par défaut est précisé dans le fichier de configuration /etc/passwd dans le dernier champ de la ligne correspondant à l'utilisateur. Il est possible de changer de shell dans une session en exécutant tout simplement le fichier exécutable correspondant, par exemple :
/bin/bash

Invite de commande (prompt)

Le shell s'initialise en lisant sa configuration globale (dans un fichier du répertoire /etc/), puis en lisant la configuration propre à l'utilisateur (dans un fichier caché, dont le nom commence par un point, situé dans le répertoire de base de l'utilisateur, c'est-à-dire /home/nom_de_l_utilisateur/.fichier_de_configuration), puis il affiche une invite de commande (en anglais prompt) comme suit :
machine:/repertoire/courant$
Par défaut dans la plupart des shells le prompt est composé du nom de la machine, suivi de deux points (:), du répertoire courant, puis d'un caractère indiquant le type d'utilisateur connecté  :
  • «$» indique qu'il s'agit d'un utilisateur normal
  • «#» indique qu'il s'agit de l'administrateur, appelé «root»

Notion de ligne de commande

Une ligne de commande est une chaîne de caractère constituée d'une commande, correspondant à un fichier exécutable du système ou bien d'une commande du shell ainsi que des arguments (paramètres) optionnels :
ls -al /home/jf/
Dans la commande ci-dessus, ls est le nom de la commande, -al et /home/jean-francois/ sont des arguments. Les arguments commençant par - sont appelés options. Pour chaque commande il existe généralement un certain nombre d'options pouvant être détaillées en tapant une des commandes suivantes :
commande --help
commande -?
man commande

Entrées-sorties standard

Lors de l'exécution d'une commande, un processus est créé. Celui-ci va alors ouvrir trois flux :
  • stdin, appelée entrée standard, dans lequel le processus va lire les données d'entrée. Par défautstdin correspond au clavier ; STDIN est identifié par le numéro 0 ;
  • stdout, appelée sortie standard, dans lequel le processus va écrire les données de sortie. Par défautstdin correspond à l'écran ; STDOUT est identifié par le numéro 1 ;
  • stderr, appelée erreur standard, dans lequel le processus va écrire les messages d'erreur. Par défautstderr correspond à l'écran. STDERR est identifié par le numéro 2 ;
entrées-sorties standard : STDOUT, STDIN, STDERR
Par défaut lorsque l'on exécute un programme, les données sont donc lues à partir du clavier et le programme envoie sa sortie et ses erreurs sur l'écran, mais il est possible de lire les données à partir de n'importe quel périphérique d'entrée, voire à partir d'un fichier et d'envoyer la sortie sur un périphérique d'affichage, un fichier, etc.

Redirections

Linux, comme tout système de type Unix, possède des mécanismes permettant de rediriger les entrées-sorties standards vers des fichiers.
Ainsi, l'utilisation du caractère «>» permet de rediriger la sortie standard d'une commande située à gauche vers le fichier situé à droite :
ls -al /home/jf/ > toto.txt
echo "Toto" > /etc/monfichierdeconfiguration
La commande suivante est équivalente à une copie de fichiers :
cat toto > toto2
La redirection «>» a pour but de créer un nouveau fichier. Ainsi, si un fichier du même nom existait, celui-ci sera écrasé. La commande suivante crée tout simplement un fichier vide :
> fichier
L'emploi d'un double caractère «>>» permet de concaténer la sortie standard vers le fichier, c'est-à-dire ajouter la sortie à la suite du fichier, sans l'écraser.
De manière analogue, le caractère «<» indique une redirection de l'entrée standard. La commande suivante envoie le contenu du fichier toto.txt en entrée de la commande cat, dont le seul but est d'afficher le contenu sur la sortie standard (exemple inutile mais formateur) :
cat < toto.txt
Enfin l'emploi de la redirection «<<» permet de lire sur l'entrée standard jusqu'à ce que la chaîne située à droite soit rencontrée. Ainsi, l'exemple suivant va lire l'entrée standard jusqu'à ce que le mot STOP soit rencontré, puis va afficher le résultat :
cat << STOP

Tubes de communication (pipes)

Les tubes (en anglais «pipes", littéralement tuyaux) constituent un mécanisme de communication propre à tous les systèmes UNIX. Un tube, symbolisé par une barre verticale (caractère «|»), permet d'affecter la sortie standard d'une commande à l'entré standard d'une autre, comme un tuyau permettant de faire communiquer l'entrée standard d'une commande avec la sortie standard d'une autre.
Ainsi dans l'exemple suivant, la sortie standard de la commande ls -al est envoyée sur le programme sortchargé de trier le résultat par ordre alphabétique :
ls -al | sort
Il est possible de cette façon de chaîner un certain nombre de commandes par tubes successifs. Dans l'exemple suivant la commande affiche tous les fichiers du répertoire courant, sélectionne les lignes contenant le mot "zip" (grâce à la commande grep) et compte le nombre de lignes total :
ls -l | grep zip | wc -l