Vous êtes sur la page 1sur 14

Initiation aux Systèmes Unix UCAU-UUT

Université Catholique de l'Afrique de l'Ouest


Unité universitaire du Togo

Module Initiation à Unix et aux


environnements GNU/Linux

Par Arnaud AMELINA

Année académique 2008 – 2009

Arnaud AMELINA 1
Initiation aux Systèmes Unix UCAU-UUT

7. Shell
7.1 Shell Unix
7.2 Concept de redirection de la sortie standard
7.3 Concept de tube
7.4 Exécution séquentielle, regroupement et imbrication de commandes
7.5 Désactivation de l’interprétation de caractères spéciaux
7.6 Méta-caractères pour l’interprétation des noms de fichiers
7.7 Historique
7.8 Concept de variable
7.9 Concept d’alias de commande
7.10 Configuration du shell
7.11 Conclusion

La maîtrise du shell est plus importante que l’on croit, ne serait-ce que pour travailler efficacement
depuis chez soi sur une machine distante, sans procéder à des transferts de fichiers à tout instant.
C’est aussi l’instrument privilégié pour la construction, l’installation et l’administration des
logiciels, hormis les plus simples, installables peut-être par « clics ». Cette section est donc
primordiale, c’est la plus importante avec la section précédente sur le système de fichiers.

Généralement, les systèmes d’exploitation proposent deux manières de lancer des applications. La
première d’entre elles a été décrite dans la section (première utilisation), c’est l’interface graphique.
La seconde forme a aussi commencé à être utilisée, c’est ce que l’on appelle le « mode commande »
via les fenêtres de terminal. Le « mode commande » est présenté plus en détail dans cette section
par le biais de l’interface correspondante appelée le shell en Unix. Comme cela a déjà été indiqué
auparavant, même si les environnements graphiques multifenêtres permettent de ne taper que peu de
lignes de commandes, l’utilisateur averti connaît les lignes de commandes correspondantes et aucun
environnement graphique multifenêtre ne pourra atteindre la puissance d’expression du « mode
commande ». En outre, les commandes permettent de mieux appréhender et comprendre les
concepts.

Cette section définit le double rôle d’un shell : interpréteur de commande et langage de
programmation. Le shell que nous utiliserons àl'UCAO-UUT en enseignement informatique est le
bash. La première partie de cette section développe la puissance d’interprétation du bash en
commençant par la description de l’algorithme du shell, en continuant avec les redirections et les
tubes, et en terminant par le passage en revue des caractères spécialement interprétés (ou méta-
caractères). À ces mécanismes (redirection, tube, méta-caractères) sont adjoints les concepts de
variable, d’alias, de structure de contrôle et de fonction (ces deux derniers points ne seront pas
abordés : ils sont juste cités pour être complet), ce qui donne un langage de programmation très
puissant, mais néanmoins difficile à maîtriser par les débutants. C’est pour cette raison que les
aspects programmation du shell ne sont juste qu’abordés. Enfin, le dernier point étudié dans cette
section montre comment configurer le shell.

7.1 Shell Unix


• À la connexion dans un terminal, l’utilisateur est mis en relation avec un interpréteur de
commandes (interface de dialogue homme/machine), appelé shell en Unix.
• Le shell choisi dans ce cours est le bash : bourne again shell, apparu avec GNU/Linux.

Arnaud AMELINA 2
Initiation aux Systèmes Unix UCAU-UUT

• Le shell possède un double rôle :


• C’est d’abord un interpréteur de commandes exécutant la boucle infinie suivante :
1. Affichage de l’invite de commande ou prompt (« $ ») d’attente de lecture au
clavier.
2. Lecture d’une commande (validée par RETURN ou ENTRÉE).
3. Analyse syntaxique (découpage en mots).
4. Interprétation des caractères spéciaux.
5. Exécution de la commande et retour au début.
• Le shell est aussi un langage de programmation gérant des variables.
Le shell est l’interface homme/machine Unix. Il en existe plusieurs qui réalisent les mêmes
fonctions de base et qui diffèrent par la syntaxe mais aussi quelque peu par les fonctionnalités
offertes. Ici, nous étudions le bash car il fait partie de la majorité des distributions standards
GNU/Linux : c’est le shell GNU. En outre, il en existe plusieurs versions dans le domaine public et
il fait partie des shells qui offrent un maximum de fonctionnalités : il est conforme au standard
IEEE POSIX P1003.2/ISO 9945.2. À titre d’information, citons quelques shells autres que bash : le
shell de Bourne (commande sh) de AT&T Bell Laboratories, le Korn shell (commande ksh) de
David G. Korn de AT&T Bell Laboratories, le c_shell (commande csh) d’origine Berkeley BSD et
le Tenex shell (commande tcsh) qui est une extension de csh.

Le principe général du shell est relativement simple. C’est une boucle infinie. On en sort soit par
l’exécution de la commande exit, soit par la frappe des touches CTRL-D. Dans le cas d’une fenêtre
de terminal, la fin du shell de connexion ferme la fenêtre. Pour analyser les commandes lues au
clavier, le shell découpe la ligne lue en mots, dont le premier est toujours considéré comme la
commande à exécuter : cette opération est l’analyse syntaxique. Pour effectuer ce découpage en
mots, le shell prend en compte les caractères définis comme séparateurs (par défaut espace,
tabulation et NEWLINE) mais aussi certains caractères spéciaux, appelés méta-caractères qui sont
alors interprétés pour remplir un rôle défini. Par exemple :
• Le shell affiche l’invite de commande ou prompt « $ » et se met en attente.
• L’utilisateur tape ls -l /usr.
• Le shell reconnaît trois mots : commande (« ls »), option (« -l ») et argument (« /usr »).
• Il crée un processus qui exécute la commande ls avec l’option et l’argument.
• Il attend la fin du processus avant de ré-afficher « $ ».
Les caractères spéciaux sont des caractères qui permettent de paramétrer l’interprétation des lignes
de commandes. Ils sont étudiés tout au long de cette section ; voici la liste de ceux que nous
étudions dans la suite : « > », « >> », « 2 > », « < », « | », « ’ », « \ », « $( » avec « ) », « ‘ », « " »,
« * », « ? », « [ » avec « ] », « ! », « - », « ~ », « ; », « ( » avec « ) », « # » et « = ». C’est cette liste
de méta-caractères qui fait peur aux novices. Nous allons donc les étudier en détails et
progressivement.
En plus du rôle d’interpréteur de commandes, le shell joue le rôle de langage de programmation, et
à ce titre, il gère des variables et des fonctions, et dispose de structures de contrôle (boucles,
conditionnelles...). Ces fonctionnalités servent essentiellement pour l’écriture de programmes
(appelés shell-script) qui permettent à chacun de paramétrer une session et de développer ses
propres outils. Dans ce module d’introduction, le shell est principalement étudié dans son premier
rôle d’interpréteur de commandes. En ce qui concerne le langage de programmation, nous nous
contentons de présenter les principales variables et shell-scripts de configuration du shell utilisé par
l’utilisateur.

Arnaud AMELINA 3
Initiation aux Systèmes Unix UCAU-UUT

7.2 Concept de redirection de la sortie standard


• À la connexion, le shell dispose de trois flots de communication :
• Entrée standard : stdin (numéro 0)
• Sortie standard et erreur standard : stdout et stderr (numéros 1 et 2)
• L’association par défaut de ces flots est l’écran pour stdout et stderr, et le clavier pour stdin.
• Une redirection est une modification de l’une ou de l’autre de ces associations.
• Elle est valable uniquement le temps de la commande sur laquelle elle porte.
• Ainsi, la redirection de la sortie standard permet de récupérer le résultat dans un fichier15 :
commande > nom_fich. Par exemple,

Ce mécanisme de redirection est un concept important du shell. Il permet de ne pas afficher les
résultats d’une commande dans le terminal mais dans un fichier pour, par exemple, garder une trace
de ces résultats pour une analyse. Les redirections sont fondamentales dans l’automatisation de
tâches répétitives. Une tâche répétitive est écrite dans un shell-script. Dans le cadre de ce module,
vous n’écrirez pas beaucoup de shell-scripts. En revanche, vous devrez être capable d’en lire.

Lorsque le shell est activé, il dispose de trois flots de communication qui sont l’entrée standard
(stdin), la sortie standard (stdout) et la sortie des erreurs (stderr). L’entrée standard est associée par
défaut au clavier (saisie des données) alors que la sortie standard (résultats de la commande) et la
sortie des erreurs (messages d’erreur de la commande) sont associées par défaut à l’écran. La
modification de l’une de ces affectations par défaut s’appelle une redirection et elle n’est valable
que le temps de la commande sur laquelle elle porte.

La redirection la plus utilisée est celle de la sortie standard avec pour objectif la récupération du
résultat d’une commande ailleurs qu’à l’écran, le plus souvent dans un fichier. Pour cela, il suffit
d’ajouter sur la ligne d’une commande le caractère supérieur suivi du nom du fichier de redirection
(> nom_fich). L’exécution de la commande avec la redirection entraîne la création d’un fichier de
nom nom_fich.
Le principe de redirection s’applique aussi à la redirection des erreurs mais pour la distinguer de la
sortie standard, il faut faire précéder le symbole de redirection du numéro du flot de communication
(2> nom_fich). Ainsi, le fichier contient les erreurs de commande : essayez par exemple la
commande erronée suivante ls-d 2> msg_erreur.
Dans son travail d’interprétation, le shell traite en premier les redirections et cela indépendamment
du résultat de la commande associée. Par conséquent, lorsqu’une commande échoue, la création du
fichier pour la redirection de la sortie standard a quand même été effectuée.
7.2.1 Redirection double de la sortie standard
• Attention, avec « > », si le fichier de redirection existe, son contenu initial est perdu.

• La redirection double (commande >> nom_fich) permet de ne pas détruire le fichier existant,

Arnaud AMELINA 4
Initiation aux Systèmes Unix UCAU-UUT

mais ajoute le nouveau contenu en fin de fichier.

• Avec « >> », si le fichier n’existe pas, il est créé, comme pour une redirection simple.
Lors d’une redirection de la sortie standard, si le fichier existe déjà, son contenu initial est perdu. Si
l’on souhaite conserver l’information contenue dans un fichier de redirection, il faut utiliser deux
fois le caractère supérieur (>> nom_de_fichier) pour que le résultat soit ajouté à la fin du fichier.
Comme pour une redirection simple, si le fichier de redirection n’existe pas, il est créé
automatiquement.
7.2.2 Redirection de l’entrée standard *
• Moins utilisée que la redirection de la sortie standard, la redirection de l’entrée standard
(commande < nom_fich) permet à une commande d’utiliser comme données le contenu d’un
fichier à la place d’une lecture clavier.
• Les exemples d’utilisation sont moins évidents.
• Exemple avec la commande write :

La redirection de l’entrée standard est peu utilisée car la plupart des commandes acceptent un nom
de fichier en argument. Par exemple, la commande cat permet de visualiser soit l’entrée standard
(appel sans argument), soit le contenu d’un fichier (dont le nom est passé en argument. Une
redirection ne ferait qu’alourdir l’écriture (cat < fichier est équivalent à cat fichier). Un contre-
exemple de la redirection de l’entrée standard qui donne un résultat différent est la commande wc.
Par exemple,
• wc -l .bash_profile
• 27 .bash_profile nombre de lignes suivi du nom du fichier
• wc -l < .bash_profile
• 27 nombre de lignes seul
La seconde commande est intéressante lorsque l’on désire n’obtenir que le nombre de lignes pour le
stocker dans une variable afin de le réutiliser plus tard dans une autre commande.
Moins utilisée que la redirection de la sortie standard, la redirection de l’entrée standard permet à
une commande d’utiliser comme données le contenu d’un fichier à la place d’une lecture clavier.
Pour cela, il suffit de placer le caractère inférieur suivi du nom de fichier de redirection (<
nom_fich). À la différence d’une redirection en sortie, le fichier de redirection doit exister sinon
cela provoque une erreur avec un message du style « no such file » ou « cannot open ».

Arnaud AMELINA 5
Initiation aux Systèmes Unix UCAU-UUT

7.3 Concept de tube


• Un tube (pipe) est une zone mémoire permettant à deux processus d’une même machine de
communiquer tout en étant synchronisés.
• L’écrivain attend une place disponible pour écrire.
• Le lecteur attend une information disponible à la lecture.
• L’objectif d’utiliser un tube est de faire agir une commande sur le résultat d’une autre sans
fichiers intermédiaires.
• Le symbole « | » placé entre deux commandes redirige la sortie standard de la première sur
l’entrée standard de la seconde.

• Cela évite des entrées/sorties disques plus coûteuses :

Un tube est une zone mémoire permettant à deux processus de communiquer de façon synchronisée,
c.-à-d. que l’écrivain est mis en attente lorsqu’il n’y a plus de place disponible, et de même, le
lecteur est mis en attente quand il n’y a pas d’information prête. Ce principe est utilisable au niveau
du shell avec le caractère barre verticale (« | ») (en anglais pipe) entre deux commandes. Cela
permet de rediriger la sortie standard de la première sur l’entrée standard de la seconde.

Les tubes sont très utilisés avec les filtres. Le principal intérêt des filtres est de pouvoir les combiner
grâce à des tubes pour cumuler leurs effets sans avoir besoin de fichiers intermédiaires. En effet, le
principe consiste à décomposer un traitement complexe en plusieurs actions plus simples et à
développer un outil pour chaque action de base, ce qui est plus facile que d’écrire directement un
programme adapté au traitement global. Ensuite, les filtres développés peuvent être réutilisés dans
la décomposition d’un autre traitement.
Avec un tube, le résultat de la première commande n’est pas accessible. Parfois, il est utile de garder
une telle information intermédiaire. Pour cela, la commande tee duplique l’entrée sans la modifier.
L’information fournie en entrée à tee est répercutée en sortie et une copie est faite dans un fichier
dont le nom est passé en argument : par exemple, ls | tee fichier | wc -l.
7.4 Exécution séquentielle, regroupement et imbrication de commandes
• Exécution séquentielle : le séparateur « ; » permet d’enchaîner des commandes sans relation
entre elles.

• Regroupement : (...) permet de considérer les commandes incluses comme une seule pour un
tube ou une redirection.

• Imbrication : entre « $( » et « ) » ou entre anti-quotes « ‘ », la commande à exécuter est


remplacée par son résultat.
• Cela permet d’utiliser le résultat d’une commande comme argument d’une autre.

Dans de nombreux exemples, la commande echo est une commande simple qui affiche ses

Arnaud AMELINA 6
Initiation aux Systèmes Unix UCAU-UUT

arguments.

Le caractère point virgule (« ; ») permet de séparer deux commandes sur une même ligne. Il s’agit
simplement d’une facilité d’écriture, les commandes sont toujours exécutées de façon séquentielle
(de gauche à droite) et indépendamment les unes des autres. Il n’y a donc aucune relation
d’imbrication, ni de regroupement, ni de passage de résultats via un tube.
Les parenthèses (<< (...) >>) servent à grouper un ensemble de commandes. Cela permet de les
considérer comme une seule pour un tube ou une redirection.
Un texte donné entre antiquotes (‘...‘) est considéré comme une commande exécutée en premier
pour que son résultat soit ensuite utilisé en lieu et place de ce texte. Cela permet d’imbriquer des
commandes. Cette syntaxe avec les antiquotes est l’écriture d’origine qui est conservée aujourd’hui
pour des raisons de compatibilité mais la nouvelle syntaxe utilise les parenthèses et le caractère
dollar : $(commande) équivaut à ‘commande‘. Cette forme est plus facile à lire car les antiquotes se
mélangent avec les quotes « ’ »que nous verrons juste après. Voici un autre exemple :
• echo il y a $(who | wc -l) utilisateurs connectés
• il y a 3 utilisateurs connectés
Dans ce dernier exemple, la commande imbriquée contient elle-même deux commandes reliées par
un tube.

7.5 Désactivation de l’interprétation de caractères spéciaux


• Entre simple quotes (« ’ ») les caractères spéciaux ne sont pas interprétés par le shell mais
deviennent de simples caractères.
• Cela permet d’utiliser les caractères spéciaux dans les arguments.

• Avec le caractère anti-slash « \ » le caractère (spécial) qui le suit n’est pas interprété.

• Si on veut mélanger des caractères spéciaux, des variables, des commandes..., il faut utiliser
les guillemets (« " »).
• Seuls sont interprétés les méta-caractères « $ » (commandes et variables), « \ »
(annulation) et «‘» (commandes).

• Avec de simples quotes, $(pwd) ne serait pas interprété.


Un texte donné entre quotes (’...’) n’est pas interprété par le shell mais considéré comme un simple
mot. Cela permet en particulier d’inclure dans un argument des caractères spéciaux (espace,
caractères de redirection...). L’exemple ci-dessus aurait créé le fichier trois.

Le caractère antislash (« \ ») précise que le caractère suivant ne doit pas être interprété par le shell,
ce qui permet d’utiliser un caractère spécial comme la quote. Le caractère antislash n’est effectif
que pour le caractère suivant, il faut le répéter autant de fois que de caractères à ne pas interpréter.
Les caractères d’un texte donné entre double quote ("...") ne sont pas interprétés sauf les trois
caractères spéciaux « $ » (utilisé pour les variables et les commandes), « \ » (annulation de

Arnaud AMELINA 7
Initiation aux Systèmes Unix UCAU-UUT

l’interprétation) et « ‘ » (utilisé pour les commandes). Voici un autre exemple


• Notes :
• « $ » est la valeur de l’invite de commande (prompt) et « > » celle de l’invite de
commande de continuation qui permet d’indiquer que la commande de la ligne
précédente de la fenêtre de terminal continue sur cette ligne ;
• Sans les guillemets, seule la première ligne serait prise en compte (le premier code
RETURN validerait la commande echo et ne serait donc pas intégré au texte du
message) ;
• Avec de simples quotes, $(pwd) ne serait pas interprété.
Nous insérons ici la présentation du caractère spécial « # » pour les commentaires : tous les
caractères figurant après ce caractère sur la même ligne de commande sont ignorés.

7.6 Méta-caractères pour l’interprétation des noms de fichiers


• Les caractères dits « Jokers » servent à référencer des noms de fichiers :
• «*» une chaîne de caractères quelconque (même vide) ;
• «?» UN caractère quelconque ;
• [...] UN caractère quelconque dans l’ensemble défini entre « [ » et « ] » ;
• [ !...] UN caractère quelconque hors de l’ensemble.
• Un ensemble est défini par une liste de caractères ([adefgw]) ou un intervalle ([0-9]) ou
toute combinaison des deux ([ab0-9A\;]).
• Par exemple,
• *.c noms suffixés .c
• *.[csp] noms suffixés .c, .s ou .p
• [ !0-9]* noms ne commençant pas par un chiffre
• Le caractère tilde (« ~ ») permet de repérer un nom de connexion :
• « ~ » seul pour le répertoire de connexion de l’utilisateur ;
• ~nom pour le répertoire de connexion de l’utilisateur nom ;
• Par exemple, ls ~domy/public liste le sous-répertoire public de domy.
Les touches « tabulation » (souvent la touche avec le signe ⇄) et ESCAPE offrent un mécanisme de
complétion des noms de fichiers selon le principe suivant : lorsque l’utilisateur tape un nom de
fichier, un appui sur la touche « tabulation » ou deux appuis sur la touche ESCAPE entraîne
l’affichage automatique du reste du nom. Si plusieurs solutions sont possibles (cas de plusieurs
fichiers avec même début de nom), le shell affiche tous les caractères communs et attend que
l’utilisateur continue la frappe. Si l’utilisateur tape une seconde fois sur « tabulation », le shell
affiche la liste des entrées commençant par le préfixe commun. Enfin, dans le cas où aucun nom de
fichier ne commence par le texte déjà tapé, un « bip » est émis.

Plusieurs caractères jouent le rôle de « jokers » pour référencer des noms de fichiers, en particulier
le caractère étoile (« * ») remplace une chaîne de caractères quelconque (même vide) et le caractère
point d’interrogation (« ? ») un caractère quelconque. Par ailleurs, utilisé seul, le caractère étoile
représente la liste des fichiers non cachés du répertoire courant (équivalent au résultat de la

Arnaud AMELINA 8
Initiation aux Systèmes Unix UCAU-UUT

commande ls). Il faut noter que le caractère point en début du nom d’un fichier doit être donné
explicitement et non pas avec un « joker ». C’est pourquoi l’étoile seule ne repère pas les fichiers
cachés.

L’utilisation des crochets permet de définir un caractère quelconque appartenant à l’ensemble défini
entre les crochets. Cet ensemble peut être défini à partir d’une liste de caractères juxtaposés
([aeiou]), ou à partir d’un intervalle pour inclure tous les caractères selon l’ordre de codage entre les
deux bornes séparées par un tiret ([0-9]), ou un mélange des deux ([0-9aeiou]). On peut également
spécifier le complément de l’ensemble indiqué en mettant un point d’exclamation (« ! ») en premier
caractère juste après le crochet ouvrant ([!...]). Il est également possible d’utiliser les classes de
caractères POSIX, qui sont standards et se comportent toujours de la même façon indépendamment
du mode de codage des caractères (ASCII, UTF-8...). Nous donnons ci-après quelques classes
utiles :

[:alpha:] correspond aux caractères alphabétique. Ceci est équivalent à [A-Za-z].


[:digit:] correspond aux chiffres (décimaux). Ceci est équivalent à [0-9].
[:lower:] correspond aux caractères alphabétique minuscules. Ceci est équivalent à [a-z].
[:upper:] correspond à tout caractère alphabétiques majuscules. Ceci est équivalent à [A-Z].
Les classes de caractères POSIX nécessitent généralement d’être protégées par des doubles crochets
([[ ]]).
En outre, le bash permet de référencer certains répertoires particuliers en interprétant le caractère
tilde (« ~ »). Seul, ce caractère correspond au répertoire de connexion. Suivi d’un nom d’utilisateur,
il permet de référencer le répertoire de connexion de cet utilisateur.
7.7 Historique
• Le shell bash enregistre toutes les commandes tapées et permet de les rappeler pour les ré-
exécuter soit telles quelles, soit modifiées.
• La commande history permet de lister le contenu de l’historique des commandes, de façon
numérotée.
• Le caractère ! permet de rappeler une commande.
• !! rappelle la dernière commande
• !n rappelle la commande numéro n
• !chaine rappelle la dernière commande commençant par chaine
• On peut aussi utiliser les flèches haut et bas pour naviguer dans l’historique des commandes.
• Lorsque l’éditeur de la ligne de commande est emacs (par défaut), il est aussi possible
d’utiliser les codes de contrôles emacs :
• CTRL-P et CTRL-N pour la commande précédente (previous) et suivante (next) ;
• CTRL-R puis une chaîne de caractères permet de rappeler une commande contenant
cette chaîne.
Dorénavant, lorsque vous voulez exécuter une commande que vous avez déjà exécutée récemment,
rappelez cette commande plutôt que de la re-taper. De même, lorque vous faites une erreur dans
l’écriture d’une commande, rappelez la ligne erronée et corrigez-la plutôt que de tout re-taper. Nous
vous demandons de faire l’effort de taper le moins de caractères possibles en utilisant au maximum
l’éditeur de commandes du shell ; rien de plus stressant et décourageant que de ne pas maîtriser
l’éditeur de commandes du shell, surtout lorsqu’un enseignant observe la scène ! Vous pouvez donc
vous préparer à être évalué sur ces points lors du contrôle.

Arnaud AMELINA 9
Initiation aux Systèmes Unix UCAU-UUT

En mode interactif, le bash mémorise dans le fichier ~/.bash_history les dernières commandes
tapées et permet de les rappeler pour les ré-exécuter, soit de façon identique, soit après
modification. Lorsqu’il affiche l’invite de commande, le shell se comporte comme un éditeur en
mode saisie de texte, c.-à-d. qu’il est prêt à lire une nouvelle commande au clavier ou à parcourir
l’historique pour rappeler une ligne précédente. En outre, à tout instant, les commandes d’édition
permettent de modifier la ligne courante. Une fois la ligne courante modifiée, il suffit d’appuyer sur
la touche RETURN pour qu’elle soit exécutée, quelle que soit la position du curseur sur la ligne. Si
la ligne courante ne peut pas être affichée en entier, le shell effectue un déplacement horizontal (en
anglais, scrolling) en affichant seulement la partie autour du curseur et il matérialise par un
caractère le fait que la ligne se continue à droite (« > »), à gauche (« < ») ou des deux côtés (« * »).
La commande history permet d’afficher l’historique des commandes de façon numérotée. Pour
accéder à une commande de l’historique, il est possible d’utiliser le caractère !. !! rappelle la
dernière commande alors que !n rappelle la commande numéro n. Enfin !chaine rappelle la dernière
commande commençant par chaine.
Il est aussi possible (et recommandé) d’utiliser les flèches haut et bas pour se déplacer aussi bien
dans l’historique et droite et gauche dans la commande courante. Lorsque l’éditeur de ligne de
commande est emacs, il est possible d’utiliser les raccourcis clavier emacs pour éditer la ligne de
commande et notamment ceux utiles à l’historique comme CTRL-P et CTRL-N pour les
commandes précédente et suivante et CTRL-R suivi d’une chaîne de caractères pour rappeler une
commande contenant cette chaîne.

7.8 Concept de variable


• Le nom d’une variable commence par une lettre ou le souligné (« _ ») suivi de lettres,
chiffres et « _ ».
• Affectation d’une variable par nom_var=valeur16 : mois=janvier.
• Utilisation d’une variable par $nom_var : echo $mois.
• Affichage de la liste des variables avec la commande set.
• Suppression d’une variable avec la commande unset : unset mois
• Quelques variables pré-définies :
• HOME : répertoire de connexion (cd et cd ~ sont égales à cd $HOME)
• PATH : liste des répertoires de recherche des commandes séparés par « : »
• L’ordre des répertoires est significatif, ce qui permet le choix de la version
d’une commande.
• PS1 : invite de commande (par défaut « $ »)
• PS2 : invite de commande de continuation (par défaut « > »)
• IFS : séparateurs de mots (par défaut, espace, tabulation et NEWLINE)
• PWD : répertoire courant
Le shell gère des variables (une zone de mémoire nommée pouvant contenir une valeur) qui servent
pour écrire des fonctions, offrir diverses fonctionnalités (invite de commande, historique...) ou
paramétrer des commandes (éditeurs de texte, messagerie...). Le nom d’une variable peut comporter
des lettres, des chiffres et le caractère souligné (« _ »), le premier caractère devant être une lettre ou
le caractère souligné. Plusieurs variables ayant un rôle pré-défini ont par convention un nom
composé de lettres majuscules.
L’affectation d’une variable s’effectue simplement avec l’opérateur égal, sans espace de part et
d’autre du caractère égal. Le contenu d’une variable peut être un entier, une chaîne de caractères, le
contenu d’une autre variable, le résultat d’une commande ou toute combinaison de ces éléments. Si

Arnaud AMELINA 10
Initiation aux Systèmes Unix UCAU-UUT

ce contenu comporte des caractères spéciaux, il faut utiliser les simples quote ou double quotes
selon l’interprétation souhaitée. Une variable est utilisable n’importe où dans une ligne de
commande (nom d’une commande, argument, option...). Le contenu d’une variable (var) est obtenu
avec son nom précédé du caractère dollar ($var). La fonction set, sans argument, permet d’afficher
la liste des variables avec leur contenu. La fonction unset permet de supprimer les variables dont les
noms sont passés en arguments.
Un certain nombre de variables sont soit positionnées automatiquement par le shell soit utilisées par
lui. On les appelle variables pré-définies et elles ont un nom composé de lettres majuscules. On peut
distinguer trois catégories de variables pré-définies : les variables d’usage général utilisées par tous
les shells (HOME, PS1, PS2, PATH, IFS), diverses extensions du bash (PWD) et des variables liées
à des fonctionnalités plus secondaires, certaines étant liées à d’autres commandes comme le type de
terminal utilisé par les éditeurs : EDITOR, DISPLAY. La variable HOME est celle qui est utilisée
lorsqu’un nom de fichier contient le tilde au début (~ /UX est remplacé par $HOME/UX) ou pour la
commande cd sans argument (cd remplacé par cd $HOME). La variable contenant l’invite de
commande est PS1. Il existe une seconde invite de commande dite invite de commande de
continuation (variable PS2) utilisée lorsqu’il y a un retour chariot dans une chaîne de caractères
encadrée par une simple quote ou une double quote : par exemple,

Le shell recherche les commandes qu’il doit exécuter dans l’un des répertoires enregistrés dans la
variable PATH. Celle-ci contient la liste des répertoires contenant des exécutables, séparés par le
caractère deux points (« : »). À la connexion, la variable PATH est initialisée avec les répertoires
standards (/bin et /usr/bin) et elle est complétée ensuite par les fichiers de paramétrage. On peut
faire figurer le répertoire courant dans cette liste en utilisant le caractère deux points en fin de liste.
L’ordre des répertoires est significatif, ce qui permet de choisir une version particulière d’un
logiciel.

7.9 Concept d’alias de commande


• Un alias sert à (re)définir le nom d’une commande.
• Cela sert à créer des mnémoniques, des noms abrégés...

Le bash permet à l’utilisateur de définir des alias, c.-à-d. ses propres mnémoniques pour accéder
aux commandes. La commande substituée par alias doit être donnée entre simples quotes si elle
comporte des caractères spéciaux. Le nom d’un alias ne doit pas comporter de méta-caractères.

Arnaud AMELINA 11
Initiation aux Systèmes Unix UCAU-UUT

L’alias ainsi créé s’utilise comme une commande ordinaire : le shell le remplace par la commande
indiquée lors de la définition de l’alias. Il est naturellement possible de compléter la ligne de
commande avec des options, des arguments et des redirections. La commande unalias permet de
supprimer les alias passés en arguments. Lors de l’analyse d’une commande, le shell commence par
substituer les alias : ainsi lorsqu’un alias porte le même nom qu’une commande, c’est l’alias qui est
utilisé. Mais on peut toujours accéder à la commande initiale en utilisant le caractère d’annulation
(« \ ») devant le nom de l’alias : par exemple alias unalias=’ls’ puis \unalias unalias. Il faut noter la
différence entre utiliser des simples quotes et des doubles quotes :
• alias lw1=’ls -l $PWD’ interprété à l’exécution donc dynamique
• alias lw2="ls -l $PWD" interprété lors de la définition donc statique
La commande alias permet également de lister les alias définis avec leurs valeurs : sans argument,
elle affiche tous les alias alors qu’avec une liste d’arguments, l’affichage est limité aux alias de cette
liste.

7.10 Configuration du shell


• Comme la plupart des logiciels importants, le shell utilise des fichiers de configuration.
Ceux-ci sont exécutés au démarrage du shell.
• Il existe 2 niveaux de configuration pour le shell : paramétrage global pour le site et
paramétrage individuel pour un compte utilisateur.
• /etc/profile est un fichier maintenu par l’administrateur pour la configuration par
défaut des comptes sur une machine.
• ~/.bash_profile, ~/.bash_login, ~/.bashrc et ~/.profile sont des fichiers maintenus par
l’utilisateur pour paramétrer son compte.
• On y trouve des affectations de variables : PATH, MANPATH, PS1..., des (re-)définitions
d’alias, le positionnement de l’umask...
• La commande set permet de modifier les valeurs par défaut des options du shell :
• set -o emacs : positionner emacs comme éditeur de la ligne de commande pour en
utiliser les raccourcis clavier :
• CTRL-A et CTRL-E pour le début (begin) et la fin (end) de ligne ;
• CTRL-D pour la suppression du caractère sous le curseur (delete).
• set -o ignoreeof : plus de déconnexion par CTRL-D, mais utiliser exit
Le shell, comme tous les logiciels "importants", utilise des fichiers de paramétrage exécutés lors de
son lancement. Le shell utilise plusieurs niveaux de paramètrage : un paramétrage global pour le
site et un paramétrage personnel lié au compte de l’utilisateur. Le shell distingue aussi plusieurs
“modes” d’exécution : les shells dits de connexion (login shell), les shells interactifs dont l’entrée et
la sortie standard sont liées à un terminal et les shells non interactifs. En fonction du type de shell,
différents fichiers de paramétrage seront utilisés.
De façon générale, les fichiers de configuration globale comme /etc/profile sont exécutés en
premier. Ce fichier, tenu à jour par l’administrateur, permet d’initialiser des variables (PATH...), de
fixer des comportements par défaut (umask...) et d’exécuter toute action commune à tous les
utilisateurs.
Ensuite, le shell interprète les fichiers de configuration propres à chaque compte utilisateur :
(.bash_profile, .bash_login, .profile ou .bashrc) situés dans le répertoire de connexion de
l’utilisateur. Ces fichiers jouent un rôle analogue à /etc/profile en permettant à chaque utilisateur de
personnaliser sa phase de connexion. Chacun peut donc définir ou compléter ses propres variables
et alias pour toute la session. Notamment vous pouvez définir votre propre invite de commande en

Arnaud AMELINA 12
Initiation aux Systèmes Unix UCAU-UUT

modifiant la valeur de la variable PS1, ajouter des chemins supplémentaires d’accès à des
programmmes en modifiant la variable PATH...
Quel que soit le shell exécuté, diverses options permettent de paramétrer son fonctionnement.
Comme toute commande, les options peuvent être précisées lors de l’appel (bash -option) mais le
shell offre en plus la possibilité de positionner ou de retirer la plupart de ces options
dynamiquement grâce à la commande set. Le shell offre la possibilité de choisir entre la syntaxe
d’édition de emacs et celle de vi qui sont les deux éditeurs les plus répandus sur Unix. Le choix de
emacs est le plus judicieux car ce type d’éditeur est en mode insertion automatique alors qu’avec vi,
il faut alterner entre un mode saisie et un mode commande en utilisant la touche ESCAPE et
diverses commandes d’insertion et d’ajout. En choisissant emacs comme éditeur de la ligne de
commande avec la commande set -o emacs dans un fichier de configuration, vous pourrez utiliser
les raccourcis emacs pour taper vos commandes. Par exemple CTRL-A vous mettra au début de la
ligne de commande, CTRL-E à la fin et CTRL-D effacera le caractère courant. Notez que vous avez
vu d’autres raccourcis clavier utiles pour la ligne de commande dans la page de cours sur
l’historique. La commande set -o ignoreeof n’autorise plus les déconnexions par CTRL-D et force
l’utilisation de exit.
Il est possible aussi de demander au shell d’afficher les commandes avant leur exécution. C’est ce
que l’on appelle le mode trace. Pour activer le mode trace, il faut taper la commande : set -x. Le
mode trace est en général utilisé pour observer ce qui est réellement exécuté par le shell en cas de
doute. C’est pour cela que ce mode n’est généralement pas activé par défaut dans les fichiers de
configuration. Pour sortir du mode trace, il faut utiliser la commande set +x.
Contenu d’approfondissement. On distingue deux types de fichiers de configuration :
• les fichiers exécutés par les shells dits “de connexion” (en anglais, login) : /etc/profile,
.bash_profile, .bash_login et .profile ; .bash_logout est exécuté à la sortie.
• les fichiers exécutés par les shells dits “interactifs” : /etc/bashrc, .bashrc.
Pour ceux et celles qui désirent connaître le fonctionnement complet, l’algorithme suivant décrit
comment bash exécute ses fichiers d’initialisation. Si l’un de ces fichiers existe mais n’est pas
accessible en lecture, bash signale une erreur. Deux cas sont montrés selon que le shell est de
connexion ou non. Pour complétude, le deuxième cas peut être divisé encore en deux sous-cas ;
nous ne le ferons pas ici (cf. pages du manuel en ligne bash).
Dans le cas des shells de connexion, au login :
• Si /etc/profile existe, il est exécuté.
• Si .bash_profile existe, il est exécuté.
• Sinon Si .bash_login existe, il est exécuté. Sinon Si .profile existe, il est exécuté.
L’option -noprofile de bash permet d’empêcher la lecture de ces fichiers. À la sortie du shell :
• Si .bash_logout existe, il est exécuté.
Dans le cas des shells interactifs, au démarrage :
• Si .bashrc existe, il est exécuté.
• L’option -norc permet d’empêcher cette lecture. L’option -rcfile permet d’utiliser un autre
fichier.
En regardant les fichiers cachés présents par défaut à la création de votre compte, vous pouvez
remarquer que c’est le fichier .bash_profile qui est utilisé. En visualisant le contenu de ce fichier,
vous pouvez observer que le fichier .bashrc est appelé. Donc, par défaut, quel que soit le shell bash

Arnaud AMELINA 13
Initiation aux Systèmes Unix UCAU-UUT

exécuté, le fichier .bashrc est utilisé. Par conséquent, si vous désirez modifier l’initialisation de
votre compte, modifier le fichier .bashrc devrait suffire dans la grande majorité des situations.

7.11 Conclusion
• En résumé, les principaux mots clefs sont les suivants :
• bash, interpréteur de commandes, langage de programmation, algorithme du shell
• Redirections (doubles) de la sortie standard et de la sortie d’erreur standard
• Tube, imbrication, regroupement, exécution en séquence de commandes
• Caractères spéciaux, méta-caractères, annulation de l’interprétation, jokers
• Historique
• Variable (pré-définie), invite de commande, chemin d’accès aux programmes du
système d’exploitation
• Alias
• Les principales commandes étudiées dans cette section sont les suivantes :
• history, alias, unalias, set, unset
• Les principaux méta-caractères étudiés dans cette section sont les suivants :
• « > », « >> », « 2 > », « < », « | », « ’ », « \ », « $( » avec « ) », « ‘ », « " », « * »,
« ? », « [ » avec « ] », « ! », « - », « ~ », « ; », « ( » avec « ) », « # » et « = »
Cette section a défini le double rôle d’un shell : interpréteur de commande et langage de
programmation. La première partie de cette section a développé la puissance d’interprétation du
bash en commençant par la description de l’algorithme du shell, en continuant avec les redirections
et les tubes, et en terminant par le passage en revue des caractères spécialement interprétés (ou
méta-caractères). À ces mécanismes (redirection, tube, méta-caractères) ont été adjoints les
concepts de variable et d’alias. Enfin, la dernière page a montré comment configurer le shell.

Arnaud AMELINA 14

Vous aimerez peut-être aussi