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 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 zsh («Zero 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
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»
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
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éfaut stdin 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éfaut stdin 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éfaut stderr correspond
à l'écran. STDERR est identifié par le numéro 2 ;
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.
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
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 sort chargé 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
|