TPs de Shell en Informatique
TPs de Shell en Informatique
TPs de shell
Arash HABIBI
Département d’informatique
Première année de licence
Semestre 1
2
Table des matières
3
2.5.4 Développement et programmation . . . . . . . . . . . . . . . . 32
2.6 Les motifs et les jokers (ou wildcards) . . . . . . . . . . . . . . . . . . 34
4 Les processus 49
4.1 Compétences visées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2 Préalable : les processus . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2.1 En substance . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2.2 Processeur, Processus . . . . . . . . . . . . . . . . . . . . . . . 49
4.2.3 Process Identifier ou le pid . . . . . . . . . . . . . . . . . . . . 50
4.2.4 User Identifier ou le uid . . . . . . . . . . . . . . . . . . . . . . 50
4.2.5 La généalogie des processus . . . . . . . . . . . . . . . . . . . . 50
4.2.6 Le statut ou état d’un processus . . . . . . . . . . . . . . . . . 50
4.2.7 Mono-tâche, multi-tâche, priorités, ordonnancement . . . . . . 51
4.2.8 La "gentillesse" des processus . . . . . . . . . . . . . . . . . . . 51
4.3 Atelier : Lister les processus . . . . . . . . . . . . . . . . . . . . . . . . 52
4.3.1 La commande top . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.3.2 La commande ps . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.4 Les commandes nice et renice . . . . . . . . . . . . . . . . . . . . . . 55
4.5 Les signaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.5.1 Fonctionnement général . . . . . . . . . . . . . . . . . . . . . . 56
4.5.2 Utilité des signaux . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.5.3 La commande kill . . . . . . . . . . . . . . . . . . . . . . . . 56
5 D’autres commandes 59
5.1 Compétences visées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2 Afficher un message à l’écran . . . . . . . . . . . . . . . . . . . . . . . 59
5.3 Créer/extraire une archive . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.3.1 Archivage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.3.2 Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.3.3 Archivage et compression . . . . . . . . . . . . . . . . . . . . . 61
5.4 Commandes diverses . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.4.1 La commande wc . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.4.2 Les commandes head et tail . . . . . . . . . . . . . . . . . . . 62
5.4.3 La commande cut . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.4.4 La commande sort . . . . . . . . . . . . . . . . . . . . . . . . 63
5.4.5 La commande grep . . . . . . . . . . . . . . . . . . . . . . . . 63
5.5 Lire les données depuis le terminal ? . . . . . . . . . . . . . . . . . . . 64
5.5.1 La commande bc . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4
5.5.2 La commande tr . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.5.3 La commande sed . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.5.4 Les autres commandes . . . . . . . . . . . . . . . . . . . . . . . 66
5.6 Pour aller plus loin : les expressions régulières . . . . . . . . . . . . . . 66
6 Les redirections 67
6.1 Compétences visées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.2 Préalable : les fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.2.1 les Entrées/sorties . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.2.2 Sous Unix, tout est fichier . . . . . . . . . . . . . . . . . . . . . 68
6.2.3 Entrée standard, sortie standard, sortie standard erreur . . . . 69
6.3 Atelier : Rediriger les entrée/sorties standards . . . . . . . . . . . . . . 70
6.3.1 Rediriger la sortie standard vers un fichier . . . . . . . . . . . . 70
6.4 Atelier : Rediriger la sortie standard erreur vers un fichier . . . . . . . 70
6.5 Rediriger la sortie standard vers un autre terminal . . . . . . . . . . . 72
6.6 Atelier : Rediriger l’entrée standard . . . . . . . . . . . . . . . . . . . . 72
6.7 Atelier : Rediriger la sortie d’un fichier vers l’entrée d’un autre fichier 73
6.7.1 Redirection via un fichier intermédiaire . . . . . . . . . . . . . 73
6.7.2 Redirection via un tube (ou pipe) . . . . . . . . . . . . . . . . . 75
6.7.3 Plusieurs niveaux de traitements : le filtrage . . . . . . . . . . . 76
7 Les variables 79
7.1 Compétences visées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.2 Les variables shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.2.1 Syntaxe de la définition . . . . . . . . . . . . . . . . . . . . . . 79
7.2.2 Expansion de variables . . . . . . . . . . . . . . . . . . . . . . . 80
7.2.3 Utilisation des accolades . . . . . . . . . . . . . . . . . . . . . . 80
7.2.4 Le type des données et l’utilisation des guillemets . . . . . . . . 81
7.2.5 Les apostrophes et les guillemets . . . . . . . . . . . . . . . . . 82
7.2.6 Les substitutions de commandes . . . . . . . . . . . . . . . . . 82
7.3 Variables de type numérique . . . . . . . . . . . . . . . . . . . . . . . . 83
7.4 La variable de status . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5
8.10.1 Chercher les fichiers erronés . . . . . . . . . . . . . . . . . . . . 97
8.10.2 Traiter un fichier csv . . . . . . . . . . . . . . . . . . . . . . . 98
6
Introduction
Maîtriser le shell
Le cours de Culture et Pratique de l’Informatique et les TPs sont assez légèrement
corrélés. En d’autres termes, vous n’avez pas besoin d’avoir suivi les cours pour réussir
les TPs et réciproquement. L’objectif de ces TPs est d’introduire l’usage du shell.
Les compétences
Chaque chapitre de ce document contient deux composantes :
— une partie introductive préalable ;
— une partie expérimentale, avec des ateliers ;
L’objectif est de vous apprendre à utiliser le shell. Chaque chapitre est associé à un
certain nombre de compétences listées au début de ce chapitre. Le chapitre contient
une partie appelée préalable avec des éléments de connaissances résumés dans les
encadrés bleus, que vous devrez connaître. Il contient aussi des ateliers, dans des
encadrés roses, que vous devez avoir faits pour acquérir les compétences visées.
Les quiz
À la fin de chaque séance de TP, votre enseignant vous demandera de lire la partie
préalable du chapitre suivant (sans nécessairement avoir fait les ateliers). La séance
suivante débutera par une séance de questions portant sur cette partie préalable.
Lorsque vous aurez posé toutes vos questions, la séance se poursuivra par un quiz sur
Moodle qui évaluera :
— les compétences pratiques que vous aurez acquises à la séance précédente ;
— la lecture de la partie préalable pour la séance courante.
Pendant ces quiz, les cours et documents, papier ou numériques seront interdits. Vous
aurez seulement droit à une antisèche : une feuille A4 recto-verso manuscrite sur
laquelle vous pouvez écrire ou dessiner tout ce que vous souhaitez. Le premier quiz,
qui aura lieu dès la première séance de TP, sera un quiz d’essai. Sa note ne comptera
pas dans votre moyenne. Il portera sur la lecture de la section préalable du chapitre
1.
Avant chaque quiz, l’enseignant vous donnera un mot de passe qui vous permettra
de vous connecter sur le quiz de son groupe.
Si vous êtes absent à une séance de TP, vous avez 7 jours ouvrés pour déposer à
la scolarité du pôle L1 un justificatif d’absence. Il est tout à fait possible de scanner
ces justificatifs et les envoyer à la scolarité par mail. Si votre absence est jugée comme
justifiée, alors la note correspondante ne comptera pas dans votre moyenne. Dans le
cas contraire, la note du quiz correspondant sera de 0/20. Les critères de recevabilité
des justificatifs sont énoncés dans un texte de loi et ne sont pas décidés par le ou la
responsable de la scolarité.
7
À la dernière séance, si vous le souhaitez, vous pouvez choisir un quiz, parmi les
huit, qui ne comptera pas dans votre moyenne.
8
Chapitre 1
1.2 Préalable
1.2.1 Un système d’exploitation
Le matériel seul ne peut rien faire
9
La mémoire contient des données sous la forme de 8 bits (octets), chaque octet
ayant une adresse. Mais la mémoire ne sait pas ce qu’est un caractère, un en-
tier, un flottant, un pixel dans une image, une variable globale, locale etc. Plus
précisément la mémoire seule ne contient aucune information qui puisse associer
un octet de données à une application ou à une autre, à un nombre, à une image
etc.
Un processeur , enfin, sait exécuter des instructions en langage machine, permet-
tant de transférer des données entre le disque, la mémoire et ses registres, mais il
ne sait pas ce qu’est une application, un processus, ou une périphérique (clavier,
souris, écran, touchpad etc). Plus précisément, le processeur seul, ne contient au-
cune information permettant de savoir si l’instruction qu’il exécute correspond
à une application ou à une autre.
10
Exemples de systèmes d’exploitation
Linux : Par défaut, les ordinateurs de l’UFR de Math-Info utilisent le système Linux
dont se réclament plusieurs disbrituions : Ubuntu (qui tourne sur les machines
de notre UFR), Redhat, Suze, Debian, Fedora etc.
Unix : Les systèmes Linux utilisés sur les ordinateurs de type PC, fait partie d’une
famille plus grande appelée Unix. Les systèmes de type MacOS font aussi partie
de la famille Unix.
Windows : La plupart des ordinateurs (PC) achetés dans le commerce sont livrés
avec le système d’exploitation Windows mis au point par microsoft corporation.
Les machines de l’UFR de Math-Info permettent également d’utiliser le système
Windows.
Téléphones : Les téléphones portables sont de véritables ordinateurs et qui utilisent
aussi un système d’exploitation iOS (pour les iPhones) ou androïd.
11
Quelquefois, certaines applications pourraient presque faire oublier l’existence de
fichiers et de processus. Dans ce cours, notre objectif est précisément d’étudier des
applications appelées shell permettant d’interagir avec le système et, en particulier,
avec les fichiers et les processus.
Les systèmes d’exploitation fournissent aussi une autre façon d’interagir avec le
système au moyen de lignes de commande. Sous windows, il s’agit de l’invite de
commandes (figure 1.6). Sous Unix (MacOs et Linux et, en particulier, Ubuntu) il
s’agit du shell (figure 1.7).
12
Dans un avion à décollage vertical, le confort est très spartiate, et on ne peut le
maîtriser qu’après de longues périodes de formation. Mais il vous permet de tout voir
à des kilomètres à la ronde, d’aller absolument où vous voulez, et ce, à de très grandes
vitesses.
De même, pour utiliser le navigateur de fichier, personne n’a besoin d’un manuel.
On peut facilement explorer son arborescence, copier, déplacer et supprimer des fi-
chiers et des répertoires. Mais pour des tâches plus complexes ou plus longues et
répétitives, le navigateur de fichiers laisse l’utilisateur démuni.
Le shell vous permet de faire absolument tout ce que fait le navigateur et bien au
delà. Un exemple : il vous permet de trouver, dans votre arborescence, tous les fichiers
dont le nom se termine par ."txt", qui datent de plus de 3 jours et dont le deuxième
mot de la troisième ligne est "pixels" et, dans tous ces fichiers, il vous permet de
remplacer ce mot par un autre mot.
Il existe différents shells. Chacun a sa syntaxe et ses spécificités, mais pour les
questions traitées dans les premiers chapitres, tous les shells sont équivalents. Voici
quelques exemples de shell :
sh Bourne shell
csh C shell
ksh Korn shell
bash Bourne again shell
Le shell utilisé dans ce cours est celui qui est lancé par défaut sur la plupart des
systèmes Linux : il s’agit du bash.
13
1.3 Lancements
1.3.1 Lancement d’un navigateur de fichiers
Atelier :
Pour ce TP et les deux suivants, je vous invite à ouvrir deux fenêtres côte à côte (cf
figure 1.11).
— un navigateur de fichiers
— et un terminal avec un shell
L’intérêt du navigateur de fichiers est de vous montrer l’effet des commandes que
vous donnerez au shell.
14
1.4 Les commandes shell
1.4.1 structure générale
1.4.2 l’instruction ls
Atelier : la commande ls
Dans le shell, entrer la commande suivante et valider avec la touche Entrée
ls
ls -F
ls Documents
ls -F Documents
15
Atelier : plusieurs options
Dans le shell, entrer la commande suivante et valider avec la touche Entrée
ls -F -1 -t -r
Cette commande affiche la même liste mais sur une seule colonne (-1) ordonnée dans
l’ordre inverse (-r) de l’ordre chronologiquement (-t). On peut enfin regrouper
plusieurs options devant un seul tiret. La commande précédente est équivalente à :
ls -F1tr
De façon générale (pour la commande ls, mais aussi pour toutes les commandes) :
gedit
Dans la fenêtre qui apparaît, entrer n’importe quel texte. Puis presser le bouton
Enregistrer en haut de la fenêtre et sauver votre texte dans le dossier personnel
sous le nom de toto. Assurez-vous que vous le voyez apparaître dans le navigateur
de fichiers. Ne pas encore quitter l’éditeur de texte. Est-ce que vous le voyez aussi
apparaître avec la commande ls ?
Si vous ne voyez rien, ne vous inquiétez pas. Lisez la suite.
16
La tâche de premier plan
Foreground job :
Par défaut, lorsque vous lancez une commande dans un shell, cette tâche est au
premier plan 1 . Dans un shell, à chaque instant, il peut y avoir au plus une tâche
au premier plan. Vous ne pourrez lancer une autre tâche que lorsque la précédente
tâche de premier plan sera terminée et que l’invite de commande sera réapparue.
Lorsque vous lancez l’éditeur gedit, il est la tâche de premier plan. Vous ne pourrez
exécuter ls ou n’importe quelle commande que lorsque gedit aura cessé et que l’invite
de commande sera réapparue.
Arrêter un programme
Ctrl + C
Atelier :
À titre d’essai, essayer d’interrompre l’éditeur gedit de cette façon.
Background job :
Le shell vous permet aussi de lancer des tâches qui ne sont pas des tâches de premier
plan, mais des tâches de fond 2 . Une telle tâche permet au shell de lancer d’autres
tâches sans pour autant avoir à quitter. Pour lancer une application en tâche de
fond, il faut le faire suivre du caractère &.
Atelier :
Lancer l’éditeur gedit en tâche de fond. (Commande : gedit &). Écrire un nouveau
ficher texte et le sauvegarder sous le nom titi. Sans quitter gedit, vérifier qu’il a
été crée avec la commande ls.
17
1.4.4 Opérations simples sur les fichiers
Atelier :
Dans cette section, vous devez deviner l’usage des commandes suivantes : cat,
cp, mv, rm, touch, mkdir et rmdir. Pour cela, vous pouvez mener les expé-
rimentations que vous voulez. Voici des propositions. Que se passe-t-il lorsque
vous entrez les commandes suivantes en regardant leur effet dans le navigateur de
fichiers. Notez que, pour l’instant les fichiers tata, tutu et tete n’existent pas
(encore).
— cat toto
— cp toto tata
— mv toto tutu
— touch tete
— rm tutu
— mkdir rep
— rmdir rep
Noter vos hypothèses sur un papier. Nous les vérifierons à la section 1.5.
Complétion automatique
Écrire la commande : cat to puis presser la touche TAB. Si le fichier toto est le
seul de votre répertoire commençant par to, alors le shell complète automatiquement
le nom de votre fichier : cat toto. Cela se révéle d’autant plus utile que le nom des
fichiers et répertoires est long.
Ne vous inquiétez pas, le résultat de la commande man n’est pas fait pour être lu
du début à la fin. Soit on se réfère à la page man d’une commande pour savoir à quoi
il sert de façon globale (et, dans ce cas, on lit seulement les premières lignes), soit on
connaît déjà la commande et on souhaite connaître son comportement dans certaines
situations particulières et, dans ce cas, on se réfère à la rubrique concernée.
Par exemple pour connaître les arguments et options de la commande ls, il suffit
d’entrer la commande :
man ls
18
Voici les rubriques les plus courantes :
ce qui signifie que toutes les options sont facultatives et l’argument aussi. Par
contre, le synopsis de la commande mkdir est :
Par exemple :
— mkdir sans option, sans argument n’est pas syntaxiquement valable, car l’argu-
ment est obligatoire ;
— mkdir -q toto n’est pas valable car -q n’est pas un argument prévu par le
synopsis ;
— mkdir -m n’est pas valable car -m doit etre suivi du mode ;
— mkdir -m 700 titi est valable car -m est suivi d’un argument qui représente
le mode ;
— mkdir -p dossier est valable.
Attention ! Le synopsis vous permet de savoir si la syntaxe est correcte, mais elle
ne vous permet pas nécessairement de savoir si la commande réussira ou non. Par
exemple si le répertoire toto existe déjà ou que le répertoire est bloqué en écriture,
ou si l’argument suivant -m ne peut pas être interprété comme un mode, la commande
ne réussira pas.
19
1.5.2 Atelier syntaxe
Atelier :
Le synopsis de la commande locate est le suivant :
locate [-0Scims] [-l limit] [-d database] pattern
Parmi les commandes suivantes, quelles sont celles qui sont syntaxiquement va-
lides ?
— locate
— locate cpi.txt
— locate -l cpi.txt
— locate -c cpi.txt
— locate -cis cpi.txt
— locate -c -d -s cpi.txt
Pour vous préparer au quizz, retenez au moins les encadrés bleus et, surtout,
reprenez la liste des compétences de la section 1.1 et assurez-vous que vous savez faire
ces opérations. Le quizz portera aussi sur la section préalable du chapitre suivant.
20
Chapitre 2
2.2 Préalable
2.2.1 Le système de fichiers est un arbre
Dans le système Unix, comme dans le système Windows, les données sont orga-
nisées sous la forme de fichiers regroupés en répertoires, chaque répertoire pouvant
contenir d’autres répertoires et d’autres fichiers. Ainsi, les répertoires forment une
structure d’arbre (à l’envers, mais arbre tout de même). Tous les fichiers et réper-
toires, sauf un, sont dans un autre répertoire. La seule exception est la racine de
l’arbre. Dans les systèmes windows, la racine de l’arbre (tout en haut) est le disque
(C:, D:, etc). Dans les systèmes de type Unix, la racine de l’arbre est un répertoire qui
s’appelle simplement / (lisez "slash"). Par exemple la figure 2.1 représente un extrait
de l’arborescence des fichiers sur une machine de l’UFR de Math-Info. Chaque nœud
de l’arbre est un répertoire et chaque feuille de l’arbre est un fichier.
21
Figure 2.1 – Un extrait de l’arobrescence sur les machines de l’UFR
Par défaut, chaque utilisateur peut lire et modifier tous les fichiers et répertoires
qui se trouvent dans son dossier personnel et ses sous-répertoires. Il peut se déplacer
dans les répertoires supérieurs et lire la plupart des fichiers, mais il ne peut pas les
modifier. Evidemment, par défaut, il ne peut ni lire ni écrire dans les répertoires des
autres utilisateurs.
Autres répertoires
— La plupart des commandes systèmes sont des programmes exécutables se trou-
vant dans le répertoire /bin ;
22
— Beaucoup de programmes installés par défaut (comme les éditeurs de texte, les
compilateurs, les navigateurs web etc) se trouvent dans le répertoire /usr/bin ;
— Les programmes installés par l’utilisateur sont souvent dans /usr/local/bin ;
— Le répertoire /proc contient des fichiers, mis à jour par le système et donnant
des informations sur l’état de celui-ci ;
— Enfin répertoire /etc n’est pas le répertoire "et cetera", mais le répertoire Edi-
table Text Configuration, contenant, comme son nom l’indique, divers fichiers
de configuration editables.
23
Par exemple, en regardant la figure 2.1, vous pouvez voir que, pour aller du répertoire
racine jusqu’à ahabibi, il faut passer par adhome, a, ah et enfin, ahabibi. De fait,
lorsque l’utilisateur ahabibi ouvre un shell, et lance la commande pwd, il obtient :
/adhome/a/ah/ahabibi
Atelier :
Ouvrir un shell et vérifier ce que vous obtenez en entrant la commande pwd.
cd Documents
Si, en entrant ls -F, vous voyez des répertoires, comme par exemple AlgoProg1/
et CPI/, alors vous pouvez aussi entrer dans ces répretoires en entrant cd AlgoProg1
ou encore cd CPI.
Remonter
Quelque soit l’endroit de l’arborescence où vous vous trouvez (sauf à la racine),
vous pouvez faire le chemin inverse, c’est à dire remonter dans le répertoire qui
contient le répertoire courant. Pour cela, il suffit d’écrire :
cd ..
24
Figure 2.2 – Le sous-arbre à créer dans Documents
25
— celui qui est juste sous le répertoire usr et qui contient les fichiers gedit, php
et firefox.
cd ..
cd ..
cd adhome
cd a
cd ab
Le shell nous permet de faire toutes ces commandes en une seule commande com-
pacte :
cd ../../adhome/a/ab
Chemin relatif :
Le chemin relatif d’un fichier ou d’un répertoire f est la suite des déplacements à
effectuer pour aller du répertoire courant vers f . Chaque déplacement est séparé des
autres par un slash /. Un déplacement vers un sous-répertoire est noté par le nom
de ce sous-répertoire et un déplacement vers le répertoire parent (vers le haut) est
noté ..
— si le répertoire courant est CPI, alors le chemin relatif du fichier TP1.py est :
../AlgoProg1/TP1.py ;
3. path en anglais
26
Atelier :
Cet atelier vous demande de vous placer dans différents répertoires et de chercher
le chemin relatif d’un autre répertoire. Afin de tester si le chemin relatif est cor-
rect, il suffit de le placer devant la commande cd. La commande devrait déplacer
le répertoire courant vers le répertoire visé (vérifier avec pwd).
— Placez-vous dans votre dossier personnel (commande cd sans argument).
Quel est le chemin relatif du répertoire Documents ?
— Placez-vous dans votre dossier personnel. Quel est le chemin relatif du ré-
pertoire adhome ?
— Placez-vous dans votre dossier personnel. Quel est le chemin relatif du ré-
pertoire ahabibi ?
— Placez-vous dans le répertoire adhome. Quel est le chemin relatif de votre
dossier personnel ?
À votre avis, comment est-ce que la machine reconnaît un chemin absolu d’un
chemin relatif ? Autrement dit, comment sait-il s’il faut partir de la racine ou de votre
répertoire courant ?
Atelier :
Sur votre machine, donner les chemins absolus suivants. De même que dans l’ate-
lier précédent, je vous invite à vérifier que ces chemins sont corrects en utilisant
la commande cd suivi du chemin absolu. Si le chemin est correcte, alors après
cette commande, vous devriez vous trouver dans le répertoire visé.
— Donner le chemin absolu de la racine.
— Donner le chemin absolu de votre dossier personnel.
— Donner le chemin absolu du répertoire Documents de votre compte.
— Donner le chemin absolu du répertoire za (qui se trouve dans le répertoire
z du répertoire adhome).
27
2.4.3 Le répertoire courant, le répertoire parent, le dossier
personnel
À retenir :
— Le caractère ~ représente votre dossier personnel ;
— Le caractère . (un point) représente le répertoire courant ;
— Les caractères .. représentent le répertoire parent du répertoire courant.
Vous connaissiez déjà la dernière notation, puisque vous l’utilisez pour monter du
répertoire courant au répertoire parent. Vous savez aussi que .. peut faire partie d’un
chemin relatif ou absolu. À présent, vous avez appris aussi que :
cd ~
vous ramène directement à votre dossier personnel. Mais le caractère tilde (~) peut
aussi être utilisé au début d’un chemin. Par exemple ~/Documents/toto.txt re-
présente un chemin absolu vers le fichier toto.txt qui se trouve dans le répertoire
Documents de votre dossier personnel.
Enfin, vous avez aussi appris que le point "." représente le répertoire courant. Mais,
pour l’instant, cette notation ne vous est pas très utile car la commande :
cd .
ne fait que vous placer à l’endroit où vous êtes déjà. Nous verrons plus loin l’utilité
de cette notation.
28
2.5.2 Pour les autres commandes
Ceci est vrai pour la commande cd, mais aussi pour toutes les commandes que
nous avons vues jusqu’ici : ls, mkdir, rm, cp, mv etc.
La commande ls
Ce que nous avons expérimenté est que, si le répertoire rep se trouve dans le
répertoire courant, alors la commande
ls rep
Les crochets droits signifient que l’argument est facultatif. Pour des raisons de
concision, je n’ai pas mentionné les options possibles.
Par exemple :
— Supposons que vous vous trouviez dans le répertoire Documents dans votre dos-
sier personnel. Pour connaître le contenu du répertoire Images, on peut désigner
ce répertoire :
+ par un chemin absolu : ls /adhome/a/ah/ahabibi/Images
+ par un chemin relatif : ls ../Images
En l’occurrence, l’utilisation d’un chemin relatif donne une commande plus
courte.
— Supposons que vous vous trouviez dans votre répertoire personnel. Pour connaître
le contenu du répertoire etc (cf figure 2.1), on peut désigner ce répertoire :
+ par un chemin absolu : ls /etc
+ par un chemin relatif : ls ../../../../etc
Dans ce cas, c’est le chemin absolu qui donne la commande la plus courte.
Atelier :
Sur votre machine, placez-vous dans votre dossier personnel et, avec la commande
ls, listez le contenu des répertoires suivants avec un chemin absolu, puis avec un
chemin relatif.
— le répertoire ah ;
— le répertoire z ;
— le répertoire /usr/bin ;
— le répertoire TP dans le répertoire CPI qui se trouve dans votre répertoire
Documents.
29
La commande mkdir
Atelier :
Sur votre machine, placez-vous dans votre dossier personnel et, avec la commande
mkdir, créer les répertoires suivants :
— un répertoire jeux dans votre dossier personnel ;
— un répertoire toto dans votre répertoire Documents (sans vous déplacer
dans ce répertoire) ;
— deux répertoires titi1 et titi2 dans le répertoire toto que vous venez de
créer (toujours sans vous déplacer).
La commande rm
Atelier :
Avant de commencer cet atelier, ouvrir un éditeur de textes (par exemple gedit)
et créer un fichier texte avec n’importe quel contenu dans le répertoire titi1 créé
ci-dessus. Dans cet atelier, je vous demande de vous placer dans votre dossier
personnel et d’utiliser les commandes rm et rmdir. Utilisez des chemins relatifs
et supprimer :
— le fichier texte que vous venez de créer dans le répertoire titi1 ;
— le répertoire vide titi1 ;
— le répertoire non vide toto ;
30
2.5.3 Copier et déplacer des fichiers et des répertoires
Ce qui a été au sujet des commandes cd, ls, rm, mkdir vaut aussi pour cp et mv.
Ces deux commandes admettent deux arguments qui sont des chemins relatifs ou
absolus.
Arguments de cp et mv
cp <arg1> <arg2>
mv <arg1> <arg2>
1. arg1 doit être le chemin absolu ou relatif d’un fichier qui existe ;
2. arg2 doit être le chemin absolu ou relatif d’un fichier (qui existe ou non)
ou celui d’un répertoire qui existe ;
Si arg2 représente un fichier, alors cp copie arg1 dans le répertoire de arg2
—
avec le nom qui se trouve à la fin de arg2 ;
Par exemple :
cp toto Documents/CPI/titi
copie le fichier toto du répertoire courant vers le dossier CPI sous le nom titi.
La commande mv fait la même chose mais, au lieu de réaliser une copie, elle
—
réalise un déplacement avec renommage ;
Si arg2 représente un répertoire, alors cp copie arg1 dans le répertoire de
—
arg2 en gardant le même nom.
Par exemple :
cp toto Documents/CPI
copie le fichier toto du répertoire courant vers le dossier CPI en gardant le même
nom toto. De même :
cp Documents/CPI/titi .
copie le fichier titi du répertoire CPI vers le répertoire courant (le point ".")
en gardant le même nom titi.
Dans le cas de la commande mv, le premier argument arg1 peut aussi être un réper-
toire.
Dans ce cas :
— si arg2 est un répertoire qui existe déjà, alors mv déplace arg1 dans arg2 ;
Par exemple :
mv Documents/CPI/TP Documents/AlgoProg1
31
mv Documents/CPI/TP Documents/nouveau
Atelier :
Placez-vous dans votre dossier personnel. Pendant tout cet atelier vous resterez
dans ce répertoire.
1. Créer un répertoire toto dans votre dossier personnel
2. Créer un fichier texte txt et le sauvegarder dans le répertoire Documents ;
3. Grâce à la commande cp, copier le fichier txt vers le répertoire toto sous
le nom copie ;
4. Grâce à la commande cp, copier le fichier txt vers le répertoire toto sous
le même nom ;
5. Grâce à la commande cp, copier le fichier bashrc du répertoire /etc vers
le répertoire toto sous le même nom ;
6. Grâce à la commande mv, déplacer le fichier txt vers le répertoire toto sous
le même nom ;
7. Grâce à la commande mv, déplacer le répertoire toto vers le répertoire
Bureau sous le nom titi ;
Lorsque vous écrivez un programme, vous pouvez, soit utiliser un IDE (Environ-
nement de Développement Intégré) comme Geany, soit utiliser un simple éditeur de
texte comme gedit. Pour certains langages, l’utilisation d’un IDE est plus pertinent
que dans d’autres. En particulier pour la programmation en C (cf le cours de BAI),
l’utilisation d’un IDE comme Geany peut s’avérer déroutante. Dans ce paragraphe,
nous allons écrire des programmes très simples (en python et en C ) et exécuter les
programmes correspondants.
Vous avez sans doute déjà effectué des TPs en AlgoProg1. Ce n’est pas le sujet
du présent atelier, mais je vous invite fortement à créer un répertoire par matière sur
votre compte : un répertoire pour AlgoProg1, un autre pour CPI et BAI etc. Et, dans
ces répertoires, je vous encourage à faire un répertoire différent pour chaque TP.
Atelier :
Ouvrir un terminal. Placez-vous dans un répertoire contenant un programme
python que vous avez écrit en TP d’AlgoProg1. Lancer ce programme avec la
commande python3. Par exemple, si votre fichier s’appelle toto.py, la commande
pour l’exécuter est python3 toto.py. Mais pour cela, évidemment, il faut se
placer dans le même répertoire que toto.py.
32
Les deux programmes suivants, l’un en py-
thon et l’autre en langage C, suivants font
le même travail : ils génèrent une image
avec un algorithme aléatoire. L’image pro-
duite s’appelle un bruit de Perlin (Per-
lin noise). Cet algorithme est utilisé très
souvent en informatique graphique, notam-
ment pour la création de textures (cf figure Figure 2.3 – Un exemple de bruit de
2.5.4). Perlin produit par les programmes de
cette section.
Atelier noise en C :
33
2.6 Les motifs et les jokers (ou wildcards)
Atelier :
— Depuis la plateforme Moodle, télécharger l’archive
03_arborescences_ex.zip et la décompresser ;
— Entrer dans le répertoire 03_arborescence_ex ainsi crée et en examiner le
contenu (ls) ;
— Quel est l’effet des commandes suivantes :
— ls GR_*
— ls *R_*
— ls *.txt
— ls t?t?.txt En particulier, est-ce que le fichier toutou.txt est listé ?
— ls t*t*.txt Et maintenant ?
Par exemple :
34
Atelier :
35
36
Chapitre 3
37
Chaque ligne est associée à un fichier ou à un répertoire. Le nom de ce fichier
ou répertoire se trouve en fin de ligne. Par exemple la première ligne est associée au
répertoire Bureau. Cet affichage fournit beaucoup d’informations que nous verrons
tout au long de ce chapitre. Dans un premier temps, retenez les données suivantes :
nature : Le premier caractère de chaque ligne est soit un caractère - (lorsque la
ligne correspond à un fichier ordinaire), soit un caractère d (lorsque la ligne
correspond à un répertoire. D’autres options sont possibles pour désigner les
liens symboliques, les sockets unix, les pipes etc. Mais je vous demande de savoir
ainsi distinguer les fichiers et les répertoires ;
taille : Le cinquième mot de chaque ligne (celui qui, dans cet exemple, suit GG_MAI)
représente la taille du fichier ou du répertoire. Sur les machines de l’UFR, cette
taille est exprimée en octets (ou bytes). Dans d’autres circonstances, cette taille
peut être exprimée en blocks mémoire.
date de dernière modification : Les dernières colonnes avant le nom représentent
la date et, pour les fichiers récents, l’heure de dernière modification du fichier
ou du répertoire.
Nous verrons plus loin la signification des autres colonnes.
Atelier :
Entrer cette commande et assurez-vous que vous savez extraire de cet affichage les
informations mentionnées ci-dessus.
3.3.2 Le groupe
group :
Chaque utilisateur connecté sur un ordinateur appartient au moins à un groupe
qu’on appelle son groupe primaire. Les utilisateurs peuvent aussi appartenir à un
ou plusieurs groupes secondaires.
La commande suivante :
id -g -n martin
38
affiche le groupe primaire auquel appartient l’utilisateur martin. La commande :
id -G -n martin
affiche tous les groupes secondaires auxquels appartient l’utilisateur martin. Quel
est l’intérêt des groupes secondaires ? Il arrive souvent qu’un utilisateur appartienne
seulement à son groupe primaire. Prenons un exemple,
— personnel (les employés permanents de l’entreprise)
— invite (les utilisateurs de passage : stagiaires, consultants, free lance)
— dev (les programmeurs)
— admin (les utilisateurs chargés de la bonne marche des ordinateurs)
Dans cet exemple, on peut imaginer que tous les utilisateurs ont un groupe pri-
maire qui est soit personnel soit invite. Parmi les utilisateurs permanents, certains
peuvent aussi avoir un groupe secondaire qui serait dev ou admin ou les deux. Comme
nous le verrons, on peut décider de donner ou de retirer à certains utilisateurs /
groupes d’utilisateurs, des droits d’accès à certains fichiers ou répertoires.
Atelier :
— Quel est le nom de votre groupe primaire ?
— Appartenez-vous à des groupes secondaires ? Si oui combien ?
— À combien de groupes secondaires appartient l’utilisateur ahabibi ?
— À combien de groupes secondaires appartient l’utilisateur root ?
39
ce qu’on dira au sujet des fichiers sera aussi vrai pour les répertoires. Pour chaque
fichier (ou répertoire) :
les trois catégories d’utilisateurs sont :
user : L’utilisateur propriétaire du fichier/répertoire ;
group : Les utilisateurs membres du groupe propriétaire du fichier/répertoire ;
other : Tous les autres utilisateurs.
Atelier :
— Pour un fichier donné, combien y a-t-il de possibilités pour les droits de
lecture ? (Vous pouvez les compter : première possibilité : lisible par per-
sonne. Deuxième possibilité : lisible seulement par le propriétaire, troisième
possibilité : ...). Indication : il y en a plus de 4.
— Pour un fichier donné, combien y a-t-il de possibilités pour tous les droits ?
40
Types de droits :
Dans chaque paquet de trois caractères :
— Le premier caractère peut être - (lecture interdite) ou r (lecture autorisée) ;
— Le deuxième caractère peut être - (modification interdite) ou w (modifica-
tion autorisée) ;
— Le troisième caractère peut être - (exécution interdite) ou x (exécution
autorisée).
Par exemple la figure 3.1 montre deux exemples de droits d’accès. Dans le premier
cas, il n’y a que des tirets -. Cela signifie que le fichier concerné n’est ni lisible ni
modifiable ni exécutable par personne (ni le propriétaire, ni le groupe ni les autres).
Dans le deuxième cas, il n’y a plus aucun tiret. Cela signifie que le fichier concerné
est lisible, modifiable et exécutable par tout le monde. Bien entendu, en pratique tous
les cas intermédiaires sont possibles.
— rw- r-- --- (configuration très usuelle) signifie que ce fichier peut être lu et
modifié (mais pas exécuté) par son propriétaire. Il peut être seulement lu par
les membres du groupe propriétaire et. Tous les autres utilisateurs n’ont aucun
droit.
— r-- -w- --x (configuration étrange, mais possible) signifie que ce fichier peut
être lu par son propriétaire mais pas modifié ni exécuté. Il ne peut pas être lu ni
exécuté par les membres du groupe, mais il peut être modifié. Enfin il ne peux
être ni lu ni modifié par les autres utilisateurs, mais il peut être exécuté. Si le
propriétaire appartient aussi au groupe, alors il peut, à la fois lire et modifier le
fichier.
41
Atelier : Décrire en détail les droits des fichiers suivants pour le propriétaire,
pour le groupe et pour les autres utilisateurs :
rwx --- ---
rw- r-- r--
--- rw- r--
La commande chmod
Dans les deux cas, pour modifier les droits d’accès à un fichier ou à un répertoire,
la commande à utiliser est chmod. En voici la syntaxe :
Syntaxe de mode
Le premier argument de chmod peut être constitué d’un motif comportant :
— un ou plusieurs caractères choisis parmi u, g ou o et qui désignent les caté-
gories d’utilisateurs concernés par le changement ;
— un et un seul caractère valant soit +, soit - et indiquant si on veut ajouter
un droit ou en supprimer ;
— un ou plusieurs caractères choisis parmi r, w ou x indiquant si on veut
changer les droits en lecture et/ou en écriture et/ou en éxécution.
Ceci est résumé sur la figure 3.2
Par exemple :
— chmod o+r toto : donne aux utilisateurs autres que le propriétaire et le groupe
propriétaire de toto le droit de le lire ;
— chmod g-w toto : enlève au groupe propriétaire de toto le droit de modifier
son contenu ;
— chmod u+x toto : donne au propriétaire de toto le droit de l’exécuter ;
— chmod o-rw toto : enlève aux autres utilisateurs le droit de lire ou de modifier
toto ;
— chmod ugo+r toto : donne à tous les utilisateurs le droit de lire toto ;
42
Figure 3.2 – Écrire un changement de mode avec chmod
Par exemple :
— chmod u=rwx toto : indique que le propriétaire doit avoir le droit de lire, écrire
et exécuter toto ;
— chmod g=rw toto : indique que le groupe propriétaire doit avoir le droit de lire
et modifier le contenu de toto (et, implicitement, ne doit pas avoir le droit de l’exécuter)
— chmod o= toto : indique que les autres utilisateurs n’ont aucun droit d’accès
sur toto.
La notation octale :
L’idée globale est d’associer les droits de lecture, écriture r 4
et exécution à des entiers. On décide d’associer la lecture w 2
à 4, l’écriture à 2 et l’exécution à 1. x 1
Cette association est résumée dans le tableau ci-contre.
43
Pour composer les droits, il suffit d’ajouter les entiers. Ainsi :
— le droit de lecture et écriture est associé à l’entier 4+2 = 6 ;
— le droit de lecture et exécution est associé à l’entier 4+1 = 5 ;
— le droit d’écriture et d’exécution est associé à l’entier 2+1 = 3 ;
— l’absence de droits est associé à 0.
Donc pour spécifier les droits d’accès pour chaque catégorie d’utilisateur, il suffit
d’un entier compris entre 0 et 7. Pour spécifier les droits d’accès pour le propriétaire,
le groupe et les autres, il suffit de trois entiers juxtaposés dans l’ordre habituel :
propritaire, groupe et autres. Par exemple :
— chmod 700 toto : indique 7 pour le propriétaire, 0 pour le groupe et 0 pour les
autres. Or 7 = 4 + 2 + 1. Donc le propriétaire doit avoir le droit de lire, écrire
et exécuter toto, mais tous les autres utilisateurs n’ont aucun droit ;
— chmod 644 toto : indique 6 pour le propriétaire, 4 pour le groupe et 4 pour les
autres. Or 6 = 4 + 2. Donc le propriétaire doit avoir le droit de lire et écrire
toto, alors que le groupe et les autres utilisateurs ne peuvent que le lire.
Atelier :
Pour chacune des spécifications suivantes pour le fichier toto, écrire la commande
version lettres et version octale. Pour la version lettres, vous pouvez écrire trois
commandes. À titre de vérification, créer un fichier quelconque et essayez vos
commandes sur lui et vérifiez qu’elles ont eu l’effet escompté.
— Donner à l’utilisateur le droit de lecture et écriture et, aux autres utilisateurs
(groupe et autres), le droit d’exécution ;
— Donner au groupe tous les droits, à l’utilisateur le droit de lire et aux autres
aucun droit ;
— Donner à tous les utilisateurs le droit de lire le fichier ;
44
Lecture
1. Assurez-vous que le fichier toto est bien accessible en lecture, écriture et exé-
cution (Quelle commande utilisez-vous pour le vérifier ?).
2. Assurez-vous que vous pouvez :
— voir le contenu de toto avec la commande cat ;
— créer une copie titi de toto avec la commande cp ;
— ouvrir toto dans un éditeur de textes.
3. Supprimer les droits de lecture pour le propriétaire de toto (c’est-à-dire vous-
mêmes) et recommencer les trois tests de la question précédente. Que se passe-
t-il ?
4. Rendre au propriétaire de toto les droits de lecture.
Écriture
1. Assurez-vous que vous avez les droits d’écriture sur toto et titi ;
2. Assurez-vous que vous pouvez ouvrir toto dans un éditeur de textes, y apporter
des modifications et sauvegarder les modifications ;
3. Supprimer les droits d’écriture pour le propriétaire de toto et titi ;
4. Est-ce que vous pouvez ouvrir toto dans un éditeur de texte, le modifier et
enregistrer les modifications ?
5. Est-ce que vous pouvez supprimer titi ?
6. Rendre au propriétaire de toto les droits d’écriture.
Exécution
1. Ouvrir le fichier toto et remplacer son contenu par les deux lignes suivantes et
sauvegarder ;
45
Lecture
1. Assurez-vous que le répertoire rep est accessible en lecture ;
2. Assurez-vous que vous pouvez lire le contenu de rep avec la commande ls ;
3. Tout en restant en dehors du répertoire rep, assurez-vous que vous pouvez
afficher le contenu de toto avec la commande cat rep/toto ;
4. Supprimer les droits de lecture pour le propriétaire de rep et refaire les deux
tests précédents ; est-ce que les deux tests donnent des résultats conformes à vos
attentes ? Je suis certain qu’un des deux tests vous aura surpris non ?
5. Rétablir les droits de lecture pour le propriétaire de rep.
Écriture
1. Assurez-vous que le répertoire rep est accessible en écriture ;
2. Assurez-vous que vous pouvez modifier le contenu de toto au moyen d’un édi-
teur de texte ;
3. Assurez-vous que vous pouvez copier toto dans un nouveau fichier titi et que
vous pouvez renommer et supprimer la copie ;
4. Supprimer les droits d’écriture pour le propriétaire de rep et refaire les deux
tests précédents ; est-ce que les deux tests donnent des résultats conformes à vos
attentes ? Là aussi, je suis certain qu’un des deux tests vous aura surpris non ?
5. Rétablir les droits d’écriture pour le propriétaire de rep.
Exécution
1. Assurez-vous que le répertoire rep et le fichier toto est accessible en exécution.
Dans le fichier toto, écrire simplement ls ;
2. Assurez-vous que vous pouvez éxécuter le fichier toto ;
3. Assurez-vous que vous pouvez entrer dans le répertoire rep ;
4. Supprimer les droits d’exécution pour le propriétaire de rep et refaire les deux
tests précédents ; est-ce que les deux tests donnent des résultats conformes à vos
attentes ?
5. Rétablir les droits d’exécution pour le propriétaire de rep.
Conclusions
De fait, le fait de changer les droits d’accès d’un répertoire n’est pas du tout
équivalent au fait de changer les droits d’accès de tous les éléments de ce répertoire.
Tout se passe comme si un répertoire était un fichier ordinaire dont le contenu était
la liste de tous ses éléments. Ainsi, le fait de créer/supprimer/renommer un fichier
dans ce répertoire reviendrait à ajouter/supprimer/modifier un élément de cette liste.
Ainsi :
46
— Le fait de supprimer les droits en lecture d’un répertoire empêche seulement
d’en lister le contenu, mais n’empêche pas de lire les fichiers de ce répertoire
si on connaît déjà leur nom ;
— Le fait de supprimer les droits en écriture d’un répertoire empêche seule-
ment de créer/renommer/supprimer des éléments de ce répertoire, mais
n’empêche pas de modifier le contenu des fichiers de ce répertoire ;
— Le fait de supprimer les droits en exécution d’un répertoire empêche d’entrer
dans ce répertoire et aussi d’accéder, en lecture, en écriture ou en exécution,
aux éléments de ce répertoire (fichiers ou sous-répertoires).
Par ailleurs, si vous souhaitez interdire l’accès (en lecture/écriture et/ou exécution)
à tous les éléments d’un répertoire rep et à tous ceux des sous-répertoires de rep, il
existe une commande simple :
chmod -R o-r rep
Cette commande supprime les droits de lecture aux autres utilisateurs pour tous les
éléments du répertoire rep et tous les sous-répertoires.
Atelier :
Supposons que nous ayons un fichier toto dans un répertoire rep. Quelle com-
mande faut-il entrer pour que :
1. personne ne puisse lire le contenu de toto ?
2. tout le monde puisse entrer dans rep ? ;
3. le groupe et les autres utilisateurs ne puissent pas changer le nom des fichiers
dans rep ?
4. le propriétaire puisse exécuter le fichier toto ?
5. le propriétaire puisse modifier le contenu de tous les fichiers dans rep, y
compris dans des sous-répertoires et des sous-sous-répertoires etc.
Par exemple, un fichier dont le mode est : ---------, ne peut être lu, modifié ou
exécuté par personne. Mais le propriétaire pourra toujours modifier ces droits d’accès.
47
Il n’existe aucun moyen de permettre à plusieurs utilisateurs (autres que les admi-
nistrateurs) de changer les droits d’un même fichier. Par contre, un utilisateur peut
donner un de ses fichiers ou répertoires à un autre utilisateur. Il s’agit d’un change-
ments de propriétaire. Le premier utilisateur ne pourra pas faire l’opération inverse. Le
changements d’utilisateur se fait avec la commande chown. La commande suivante :
chown ahabibi toto
ne peut être entrée que par le propriétaire du fichier ou répertoire toto. Elle a pour
effet de faire de ahabibi le nouveau propriétaire de toto.
48
Chapitre 4
Les processus
4.1 Compétences visées
1. Connaître la liste des processus sur une machine ;
2. Connaître la liste des processus lancés par un utilisateur donné ;
3. Connaître la quantité de ressources (mémoire ou la puissance de calcul)
consommées par un processus ;
4. Connaître les principaux états dans lesquels peut se trouver un processus ;
5. Interrompre un processus ;
6. Changer la priorité d’un processus.
Processeur :
Un processeur est une composante électronique capable d’exécuter des instruc-
tions de calcul très rapidement (cf figure 1.1). Pendant longtemps, chaque ordi-
nateur contenait un seul processeur.
Sur votre machine, vous avez certainement de nombreuses applications installées.
Vous avez peut-être un navigateur web, un éditeur de texte, Word, Excel, LibreOffice
etc. Tant que vous n’avez pas lancé ces applications, ce ne sont que des programmes
qui ne nécessitent aucun calcul et aucune mémoire, mais seulement de l’espace disque.
Programme :
Un programme, comme ceux que vous écrivez en python, sont des fichiers com-
posés d’instructions que le processeur peut exécuter.
Dès le moment où vous lancez une application, ses instructions sont chargées
en mémoire et ces instructions commencent à être exécutées par le processeur. Un
49
processus vient d’être créé.
Processus :
Un programme lancé (par l’utilisateur ou par d’autres programmes) et chargé en
mémoire est appelé un processus.
Un même programme peut être à l’origine d’un ou plusieurs processus. En effet,
rien ne vous empêche de lancer plusieurs éditeurs gedit par exemple. Le programme
est unique, mais chaque fenêtre d’éditeur correspond à un processus séparé. Chacun
occupe un espace séparé en mémoire et envoie ses instructions au processeur.
Processus identifier :
Chaque processus lancé sur une machine a un identifiant unique sous la forme
d’un entier, et qui est appelé le process identifier ou, plus communément le pid ;
User identifier :
Chaque processus a un propriétaire qui est, presque toujours, l’utilisateur qui a
lancé ce processus. Les droits qu’a un processus de lire/écrire/exécuter un fichier
ou un répertoire sont ceux de son propriétaire
Dans notre exemple, le processus parent du processus ls est le processus shell. Mais
le processus shell, lui-même a un autre processus parent et ainsi de suite. Tous les
processus sur la machine ont un ancêtre commun, qui est le processus de pid 1, et qui
a été lancé par le système au démarrage de la machine. On pourrait représenter tous
les processus d’une machine sous la forme d’un arbre, un peu à l’image d’un arbre
généalogique.
50
bouge la souris ou qu’arrive un message sur le réseau etc.). Pendant ce temps, il n’a
pas besoin d’envoyer des instructions au processeur. On dit que ce processus est en-
dormi. Dès que l’événement attendu a lieu, le processus peut repasser dans l’état en
cours d’exécution.
Ordonnancement :
Les processus en cours d’exécution se partagent le processeur. Celui-ci exécute
quelques instructions de l’un, puis quelques instructions de l’autre et ainsi de
suite. Un processus est caractérisé par un niveau de priorité. Plus un processus
est prioritaire et plus il peut utiliser le processeur. On dit que le système réalise un
ordonnancement : à chaque instant, en tenant compte des priorités et du temps
passé par chaque processus à attendre son tour, le système détermine le processus
qui peut avoir accès au processeur.
51
Nice :
Chaque processus est caractérisé par une valeur de gentillesse (nice) comprise
entre -20 et 19.
— Les processus dont le nice est de -20 sont les plus prioritaires ;
— Les processus dont le nice est de 19 sont les moins prioritaires ;
— Souvent, la valeur par défaut est de 0.
— Tous les utilisateurs peuvent augmenter la gentillesse (diminuer la priorité)
de leurs processus. Seul l’administrateur peut diminuer la gentillesse (aug-
menter la priorité) d’un processus.
52
Figure 4.1 – La liste affichée par la commande top.
Atelier :
— Veillez à quitter la plupart de vos applications en cours ;
— Dans un terminal, lancer la commande top ;
— Lancer/quitter différents processus (un autre terminal, un autre top, gedit,
navigateur web, etc) et voir les processus correspondant apparaître et dis-
paraître dans la liste.
— Dans top, presser plusieurs fois et de façon rapide la touche espace et voir
comment évolue la consommation CPU du processus top ;
— Quitter top.
4.3.2 La commande ps
La commande top est sans doute une commande conviviale et interactive, qui
montre l’état des processus en temps réel. Mais, comme nous le verrons, il est plus
difficile d’extraire de ses résultats des données spécifiques pour les fournir à d’autres
commandes/traitements. C’est pourquoi, on utilise aussi très souvent une commande
plus classique, appelée ps :
53
ps : (Process Status)
est une commande :
— qui affiche l’état des processus au moment précis où elle est lancée ;
— les résultats ne sont pas mis à jour (à moins de relancer la commande) ;
— mais les résultats sont exploitables par d’autres commandes (cf chapitre 6).
Cette commande possède beaucoup d’options permettant d’afficher différentes in-
formations et de les trier suivant différents critères. Nous n’en verrons que quelques
unes :
Les options de ps :
— ps : sans option, affiche la liste des processus lancés depuis le shell courant
(celui où la commande ps a été lancée) (figure 4.2) ;
— ps -u martin : affiche la liste des processus lancés par l’utilisateur martin ;
— ps -e : affiche la liste de tous les processus existant sur la machine ;
— Dans tous les cas, on peut ajouter l’option -l. Celle-ci affiche les mêmes
processus que si on ne met pas cette option, mais, pour chacune d’elles,
fournit plus d’informations (figure 4.3).
Atelier
Commencer par ouvrir deux terminaux. L’un d’eux servira à lancer la commande
ps avec différentes options et l’autre vous permettra de lancer différents pro-
grammes ;
1. Lancer un programme sur le premier terminal (par exemple gedit & et
gimp &) et un top sur le second terminal
2. Quelle est la liste des processus affichée par ps lancé dans le premier termi-
nal ? Contient-il gedit ? top ?
3. Même question pour la commande ps -u ahabibi (en remplaçant ahabibi
par votre nom d’utilisateur) ?
4. Même question pour la commande ps -e.
Certaines commandes (comme par exemple ls) ont les options assez similaires d’un
54
constructeur à un autre et d’un unix à l’autre. Et les résultats produits sont aussi
identiques. Il n’en est pas de même pour ps et pour more. Si vous ne travaillez pas sur
les machines de l’UFR, vous verrez peut-être des résultats sensiblement différents.
Atelier
En regardant la figure 4.3, pouvez-vous dire :
1. quels sont les processus en cours d’exécution (qui ne sont pas endormis) ?
2. pourquoi les autres processus (éditeur de texte, retouche d’image, naviga-
teur web) sont-ils endormis ?
3. quel est le processus parent de gedit ? de gimp ? de ps ? de script-fu ?
Atelier
Lancer la commande geany avec un nice de 5 et vérifier, en lançant ps, que le
nice du processus est bien de 5.
renice :
Lorsqu’un processus est déjà lancé, il est possible de modifier la valeur de son
nice avec la commande renice. Pour mettre la valeur de son nice à P, la syntaxe
est :
renice P pid
où pid est l’identificateur du processus.
La commande :
renice +1 1105
55
4.5 Les signaux
Les signaux sont un des outils existant dans les systèmes Unix qui permettent à
des processus de communiquer entre eux.
Signaux :
Lorsqu’un processus A envoie un signal à un processus B, deux cas de figure sont
possibles :
— le processus B a prévu de recevoir ce signal en associant celui-ci à une
fonction de gestion de signal (handler). Dans ce cas, à la réception de ce
signal, le handler est appelée, ce qui permet au processus de réagir d’une
façon ou d’une autre. On dit que le processus a attrapé ce signal.
— si le processus B n’a pas prévu de recevoir ce signal, alors, dans la plupart
des cas, l’arrivée du signal met un terme au processus.
Dans le cadre de ce cours, nous allons utiliser les signaux essentiellement pour
interrompre les processus. Dans les semestres suivants, vous apprendrez comment
attraper les signaux.
— Une des utilités des signaux est de permettre à deux processus de se synchroni-
ser. Un des processus A (a priori le plus lent ou celui dont le cycle dure le plus
longtemps) lance un signal à un processus B pour lui signifier qu’il a terminé son
cycle. Le processus B réagit à ce signal, par exemple en entamant un nouveau
cycle.
Dans tous les cas, l’information véhiculée est minimale, mais elle est asynchrone.
Autrement dit, pour le recevoir, le processus B n’a pas besoin d’être à un stade
particulier de son avancement. En particulier, il n’est pas nécessaire qu’il soit en train
d’attendre le signal ou quoi que ce soit d’autre. Il peut le recevoir alors même qu’il
est en plein milieu de l’exécution d’une instruction.
56
kill :
Le man page de kill vous donnera toutes les syntaxes possibles. Nous en verrons
une ici :
kill -numero pid
où pid est l’identificateur du processus que nous voulons arrêter et
où numero est un numéro qui identifie le signal.
Voici quatre numéros correspondant à quatre signaux :
2 SIGINT le signal qu’envoie Ctrl + C ;
24 SIGTSTP le signal qu’envoie Ctrl + Z et qui suspend le processus ;
18 SIGCONT un signal qui fait repartir un processus suspendu ;
19 SIGSTOP un signal qui suspend le processus et que celui-ci ne peut ni attraper ni ignorer ;
9 SIGKILL un signal qui tue le processus et que celui-ci ne peut ni attraper ni ignorer.
Par exemple :
— si, depuis un shell, vous lancez gedit et que ce processus a un pid de 60533,
alors la commande :
kill -2 60533
kill 36644
57
58
Chapitre 5
D’autres commandes
Dans le chapitre 1, nous avons les premières commandes. En voici d’autres qui
nous seront très utiles dans le(s) prochain(s) chapitre(s).
Atelier echo :
Essayer les commandes :
— echo "bonjour"
— echo Doc*
Voilà une commande qui semble bien innocente, voire inutile. Nous verrons plus
loin son utilité.
59
Figure 5.1 – L’archivage consiste à rassembler plusieurs fichiers ou toute une
arborescence dans un seul fichier appelé archive.
5.3.1 Archivage
tar :
La commande tar permet de constituer des archives à partir d’un ou plusieurs
fichiers ou arborescences. Elle permet également d’extraire tout ou partie des
fichiers de l’archive. Dans cette commande :
— l’option -f permet de désigner le fichier archive ;
— l’option -v active le mode verbeux et liste à l’écran l’ensemble de tous les
fichiers archivés ou extraits (selon le cas) ;
— l’option -c spécifie qu’on souhaite créer l’archive ;
— l’option -x spécifie qu’on souhaite extraire des éléments de l’archive.
— Étudier la page man de la commande tar pour d’autres options.
Par exemple :
60
tar -tf archive.tar
5.3.2 Compression
Il y a de nombreux programmes de compression de fichiers. Sentez-vous libre
d’utiliser celui qui vous convient. Dans cette section, nous en présenterons deux :
gzip et compress.
Atelier compress :
Atelier gzip :
Faire de même avec la commande gzip. Dans le cas de votre fichier image, laquelle
des deux commandes a réalisé la compression la plus efficace ?
Le format tgz :
En ajoutant l’option -z la commande tar permet de compresser en archivant et
de décompresser en désarchivant. L’archive compressée est un fichier au format
tgz ou tar.gz. De fait, pour la compression/décompression, tar utilise gzip.
Par exemple :
61
permet de décompresser et de désarchiver archive.tgz.
Atelier tgz :
— Télécharger, depuis la plateforme Moodle, l’archive 06_commandes_txt.tgz
et la décompresser/désarchiver en une seule commande.
Le format zip :
Le nom de cette commande ressemble beaucoup à celui de gzip. Pourtant, pour
compresser ses archives, la commande zip utilise compress (et non gzip).
Atelier zip :
— Entrer man zip.
— Utilizer zip pour archiver/compresser le répertoire que vous avez décom-
pressé dans l’atelier précédent.
— Quelle commande faut-il utiliser pour faire l’opération dans le sens inverse ?
Dans le répertoire 06_commandes_txt décompressé dans l’atelier précédent, vous
trouverez des fichiers texte que nous utiliserons souvent pour tester les commandes
suivantes.
Atelier wc :
Quel est le résultat affiché par les commandes suivantes ?
— wc -l pi.txt En
— wc -w pi.txt
— wc -c pi.txt
entrant man wc, déterminer à quoi correspondent les chiffres affichés par chacune des
trois commandes.
62
5.4.3 La commande cut
Placez-vous dans le répertoire 06_commandes_txt contenant les fichiers pi_ligne1.txt,
path.txt et csv.txt. Prenez connaissance du contenu de ces fichiers.
Atelier cut :
Quel est le résultat affiché par les commandes suivantes ?
— cut -d ’/’ -f 1 path.txt
— Réessayer avec d’autres valeurs que 1 ;
— cut -d ’,’ -f 1 csv.txt
— Réessayer avec d’autres valeurs que 1 ;
— cut -d ’ ’ -f 1 pi_ligne1.txt
— Réessayer avec d’autres valeurs que 1 ;
Là aussi, je pense que vous avez deviné à quoi peut servir la commande cut. Entrer
man cut à titre de vérification.
Atelier sort :
Quel est le résultat affiché par la commande suivante ?
— sort noms.txt
Entrer man sort pour connaître l’utilité de cette commande.
La commande grep :
La commande suivante :
grep chaine fichier(s)
n’affiche rien à l’écran, ce qui signifie que le fichier laParure.txt ne contient pas le
mot maitre. Par contre, la commande suivante :
affiche :
63
ce qui signifie que le fichier Repliques.txt contient bien le mot maitre et que la
ligne où se trouve le mot maitre est celle qui a été affichée. On peut même donner
plusieurs fichiers en argument :
ce qui signifie que les deux fichiers contiennent la chaîne donne (même si, dans le
fichier Repliques.txt il s’agit d’une sous-partie du mot Abandonne). On peut même
donner en argument un motif qui désigne tout un ensemble de fichiers :
ce qui signifie que, parmi tous les fichiers dont le nom se termine par .txt, le seul qui
contiennent la chaîne fausse est le fichier laParure.txt.
La commande grep contient de très nombreuses options permettant différentes
variantes :
— afficher ou non les numéros de lignes et/ou le nom des fichiers où se trouvent
les correspondances ;
— afficher seulement le nombre de correspondances ;
— ignorer ou prendre en compte la casse (minuscule/majuscule) ;
— afficher seulement les lignes où il n’y a PAS de correspondances ;
— rechercher récursivement dans un répertoire et tous les sous-répertoires qu’il
contient ;
— et ainsi de suite.
Pour l’heure, nous nous contenterons d’utiliser cette commande sans option.
Atelier grep :
Placez-vous dans le répertoire 06_commandes_txt. En utilisant la commande
grep :
— déterminer dans quel(s) fichier(s) il est question de "Skywalker" ;
— déterminer quel(s) fichier(s) contiennent le mot "comprends" ;
— réaliser chacune des deux recherches précédentes avec une seule commande ;
Nous verrons, à la section 5.6, comment on peut chercher non pas seulement des
mots, mais toute une classe de mots vérifiant certaines propriétés, ou plutôt, conformes
à certains motifs.
64
au chapitre suivant, comment cela peut s’avérer d’une extrême puissance, autrement
dit, que cela permet de réaliser une très grande variété de traitements.
Contrairement aux commandes précédentes, celles que nous allons voir, ne se ter-
minent pas immédiatement après l’envoi de la commande. Elles attendent que vous
entriez du texte (0, une ou plusieurs lignes de texte). À chaque ligne, vous pouvez voir
le texte que vous avez entré suivi du résultat de la commande. À la ligne suivante,
la commande attend de nouveau votre contribution et ainsi de suite, jusqu’à ce que
vous ayez entré la séquence :
Ctrl + D
5.5.1 La commande bc
Atelier bc :
— Entrer la commande bc
— Entrer le texte suivant : 3 * 5 ←-
— Entrer le texte suivant : 45 / 9 * 20 ←-
— Ctrl + D
Lancer man bc pour avoir la confirmation de l’utilité de la commande bc. Vous
aurez compris à quels endroits, il faut utiliser la touche Entrer. Donc je ne remettrai
plus les signes ←-.
5.5.2 La commande tr
Atelier tr :
1. Entrer la commande tr c t
— Entrer : Le cafe a crame a la cave
— Entrer : Ceci est beaucoup trop chaud
— Ctrl + D
2. Entrer la commande tr -s a
— Entrer : wah, waaaah, waaaaaaaaaaaaaaaaah
— Ctrl + D
3. Entrer la commande tr -d m
— Entrer : Maman met la main a la poche
— Ctrl + D
4. Entrer la commande tr -d aeiou
— Entrer : Il y a des escrocs partout non ?
— Ctrl + D
5. La commande tr peut même prendre en argument des motifs. Entrer la
commande tr -d [:upper:]
— Entrer : BOOGIE, Boogie, boogie
— Ctrl + D
6. Entrer la commande tr [:lower:] [:upper:] et entrer n’importe quel
texte avec des lettres minuscules.
Lancer man tr pour avoir la confirmation de l’utilité de la commande tr.
65
5.5.3 La commande sed
La commande tr permet de remplacer certains caractères par d’autres caractères.
Mais pour remplacer des mots, nous avons besoin d’une autre commande, là aussi
d’une extraordinaire puissance, mais dont nous n’allons entrevoir qu’un aspect : la
commande sed.
Atelier sed :
— Entrer la commande sed -e ’s/Bonjour/Au revoir/g’
— Entrer le texte suivant : Bonjour tout le monde.
— Ctrl + D
Autres commandes :
Entrer les commandes suivantes sans ajouter d’argument, puis entrer quelques
lignes de texte et finir par Ctrl + D.
1. Entrer la commande cat sans argument ;
2. Entrer la commande wc -l sans argument ;
3. Entrer la commande : head -n 2 (entrer un texte qui fasse plus que 2
lignes) ;
4. Entrer la commande : tail -n 2 (entrer un texte qui fasse plus que 2
lignes) ;
5. Même chose pour les commandes :
— sort
— grep "controle" (entrer un texte qui contienne controle sur une des
lignes) ;
6. Est-ce que le même mécansime fonctionne pour les commandes suivantes ?
— ls
— tar -czvf toto.tgz
— compress
— gzip
— zip
66
Chapitre 6
Les redirections
6.1 Compétences visées
1. Mettre le résultat d’une commande dans un fichier ;
2. Lire l’entrée d’une commande depuis un fichier ;
3. Afficher le résultat d’une commande dans un autre terminal ;
4. Distinguer et séparer la sortie standard et la sortie standard erreur ;
5. Rediriger une des sorties vers la poubelle ;
6. Rediriger la sortie d’une commande vers l’entrée d’une autre commande
(filtrage) ;
7. Enchaîner plusieurs filtrages ;
8. Étant donné une tâche à réaliser, l’exprimer sous la forme d’un enchaîne-
ment de filtrages.
Ce chapitre va vous permettre de combiner des commandes pour faire des com-
mandes plus complexes. Il va augmenter significativement vos possibilités.
67
— la commande ls fournit des informations affichées sur le terminal (sortie à
l’écran).
Les fichiers
Une des particularités des systèmes de type Unix est qu’un grand nombre de
périphériques (terminaux, tubes, sockets, haut-parleurs, usb) peuvent être utilisés
comme s’il s’agissait de fichiers réguliers. D’ailleurs, ce que nous avons appelé
fichier jusqu’ici, (c’est à dire des données stockées sur le disque) devrait, en toute
rigueur, s’appeler fichier régulier. Lorsqu’on parle de fichier tout court, en toute
rigueur, on désigne un fichier généralisé, c’est à dire l’un des éléments suivants
(fichier régulier, répertoire, terminal, tube, socket etc).
— Comme nous le verrons, on peut lire et écrire dans un terminal comme dans un
fichier régulier ;
— Les tubes 1 peuvent être établis entre deux processus et leur permettre de com-
muniquer des données et se synchroniser. On peut lire et écrire dans ces tubes
comme dans des fichiers ;
— De même, les sockets peuvent être établis entre des processus distants (tour-
nant sur différentes machines sur le réseau). Toutes les applications utilisant le
réseaux ont recours aux sockets.
Ces fichiers, au sens général, même s’ils peuvent être accédés en lecture et en écri-
ture, presque comme des fichiers réguliers, n’apparaissent pourtant pas nécessairement
dans l’arborescence des fichiers.
1. pipe en anglais
68
6.2.3 Entrée standard, sortie standard, sortie standard erreur
Pour utiliser un fichier (fichier régulier,
tubes, terminaux, sockets etc), un pro-
cessus ouvre ce fichier :
— en lecture si on souhaite qu’il soit
une source d’information ;
— en écriture si on souhaite l’utili-
ser pour fournir de l’information.
Lorsqu’il a fini de l’utiliser, le proces-
sus peut fermer ce fichier. Le système
associe à chaque processus une liste de
fichiers :
— À chaque fois que le processus
ouvre un fichier, cette liste s’al-
longe d’un élément.
— À chaque fois que le processus
ferme un fichier, cette liste se Figure 6.1 – Liste des fichiers
raccourcit d’un élément. associée à un processus. Les trois
premiers sont ouverts
Par exemple, dans le cas de la figure automatiquement. Certains processus
6.1 sept fichiers sont ouverts corres- en ouvrent d’autres.
pondant à des fichiers réguliers, des
terminaux, untube et un socket.
Pour désigner chaque fichier ouvert, le processus utilise l’indice de ce fichier dans
la liste ci-dessus. Cet indice (un entier donc) est appelé le descripteur de ce fichier.
69
testé dans les ateliers du chapitre précédent (section 5.5.4) que wc peut prendre
en entrée des données tapées au clavier.
a le même effet, à ceci près que, si fichier n’est pas initialement vide, le texte
affiché par commande n’écrase pas le contenu de fichier mais s’ajoute à la fin de
celui-ci.
70
pour voir, selon les besoins, seulement les résultats valides ou seulement les messages
d’erreur.
a le même effet, à ceci près que, si fichier n’est pas initialement vide, le texte
affiché par commande n’écrase pas le contenu de fichier mais s’ajoute à la fin de
celui-ci.
N’oubliez pas de remettre les droits de lecture sur le dossier des téléchargements
et de supprimer les fichiers erreurs.txt et lsTout.txt. De fait, même lorsqu’il ne
s’agit pas d’un exercice, comme ici, il arrive souvent qu’on soit intéressé seulement
par l’un de ces deux flux : résultats valides ou messages d’erreur. Dans chaque cas,
pour ne pas voir un des deux flux, on le redirige vers un fichier qu’on supprimera par
la suite. Voici la solution :
Le fichier /dev/null :
Le fichier /dev/null est un fichier spécial caractères. Il a une propriété particu-
lière : toutes les données écrites ou redirigées dans ce fichier sont supprimées de
façon immédiate et définitive.
71
La commande find et le fichier /dev/null :
La commande find peut être utilisée de nombreuses manières. Elle permet, en
particulier, de chercher un fichier dans une arborescence d’après son nom, sa date,
sa taille, son propriétaire, son groupe, son type etc. En particulier, la commande :
cherche, dans le répertoire courant (premier argument : ".") et tous ses sousréper-
toires, tous les fichiers du nom de toto.
Atelier :
La commande tty :
Cette commande fournit le chemin absolu du fichier correspondant au terminal
sur lequel cette commande a été entrée.
Atelier :
72
Redirection de l’entrée standard :
Soit commande une commande qui puisse prendre ces données depuis l’entrée
standard. Dans ce cas :
— Créer un fichier dont le contenu est l’expression arithmétique que vous avez
fournie au clavier à la commande bc.
— En utilisant la redirection de l’entrée standard, lancer la commande bc en
lui donnant, comme entrée, le contenu du fichier crée ci-dessus.
— Créer un fichier dont le contenu est la phrase que vous avez fournie au
clavier à la commande tr ’e’ ’a’.
— En utilisant la redirection de l’entrée standard, lancer la commande tr ’e’
’a’ en lui donnant, comme entrée, le contenu du fichier crée ci-dessus.
La commande tr n’admet pas d’argument fichier. La redirection est la seule façon
d’utiliser cette commande sur un fichier. Les autres commandes mentionnées ci-dessus
admettent, pour la plupart, un fichier comme argument. Ils peuvent donc recevoir leur
données soit via un argument fichier soit via une redirection de l’entrée standard. En
général, lorsqu’on utilise ces commandes seules, on donne les fichiers en argument.
Mais, comme nous allons le voir dans la section suivante, lorsqu’on utilise ces com-
mandes en combinaison avec d’autres commandes, il peut être intéressant de fournir
les données via l’entrée standard.
73
vous savez extraire les n premières lignes d’un fichier. Si vous aviez un fichier contenant
ces n premières lignes, il vous suffirait de prendre la dernière ligne, qui n’est autre
que la n-ième ligne du fichier de départ.
— tail -n 1 tmp
Tant que nous utilisons des fichiers comme interméidiaires entre les commandes,
les deux options sont équivalentes. Mais, dans les sections suivantes, nous aurons
d’autres outils à notre disposition. Et nous ne pourrons utiliser ces outils qu’en ayant
recours à l’entrée standard (c’est à dire la deuxième option ci-dessus). La démarche
globale est déctrite à la figure 6.2.
Figure 6.2 – Le fichier est en même temps la sortie standard de cmd1 et l’entrée
standard de cmd2 et leur permet ainsi d’échanger des données
74
6.7.2 Redirection via un tube (ou pipe)
commande1 | commande2
Figure 6.3 – La sortie de la commande cmd1 est directement redirigée vers l’entrée
de la commande cmd2 via un tube (pipe).
Dans cette section, pour alléger la mise en page, nous n’avons pas mis tous les
ateliers dans des encadrés roses mais, de fait, la suite de cette section est consacrée à
des ateliers vous permettant d’explorer les possibilités de ce nouvel opérateur. Dans
un premier temps, la première commande sera toujours la commande ls -l (ou sim-
plement ls) :
Atelier redirection pipe :
Les tâches suivantes sont à réaliser en une seule commande bash.
La première commande est ls ou ls -l.
75
9. Est-ce que, vous pourriez, de la même façon, extraire la cinquième colonne, celle
des tailles de fichiers ?
10. Lister tous les fichiers au format long (utiliser ls -l) ; mais en remplaçant toutes
les répétitions d’espaces par un espace unique (cf commande tr -s) ;
1. Essayer la commande date sans arguments. Écrire une commande qui extrait
l’heure courante au format hh:mm:ss (par exemple 20:31:48)
2. Calculer la valeur de l’expression : 31 + 5 ^ 2 ou toute autre expression, sans
l’avoir écrit dans un fichier
3. Afficher les 10 premières lignes de la page de man de la commande ls
4. Écrire une commande qui affiche le nombre de lignes d’un fichier toto. On
souhaite qu’elle affiche seulement un entier représentant le nombre de lignes.
On ne souhaite pas que soit aussi affiché le nom du fichier. Indication : il faut
envoyer le contenu du fichier vers l’entrée standard de wc -l.
5. Écrire une commande qui compte le nombre de fois où le mot import apparaît
dans le contenu des fichiers du répertoire courant.
76
Figure 6.5 – Une commande composée de plusieurs étages, la sortie de chaque
étage étant redirigée vers l’entrée de la suivante.
Atelier filtrage 1 :
Les tâches suivantes sont toujours à réaliser en une seule commande bash.
Elles nécessitent deux pipes.
Atelier filtrage 2 :
Ajoutons d’autres niveaux.
1. Nous allons reprendre le travail sur le fichier notes.csv. Nous souhaitons or-
donner ce fichier pour que les noms soient dans l’ordre alphabétique. Écrire deux
commandes :
— Écrire une première commande qui extrait la première ligne de notes.csv
(qui contient les titres de colonne) et l’enregistre dans le fichier notesTriees.csv ;
— Écrire une seconde commande qui extrait les 7 dernières lignes de notes.csv,
qui trie ces lignes et les ajoute à la fin du fichier notesTriees.csv ;
2. La commande ls -lS est équivalente à la commande ls -l à ceci près que les
fichiers sont ordonnés dans le sens décroissant des tailles. Écrire une commande
qui affiche la taille du fichier le plus volumineux du répertoire courant. Pour
cela, vous ferez un premier filtre qui supprime les répétitions d’espace, un autre
77
filtre qui extrait la deuxième ligne (le fichier le plus volumineux) et un dernier
filtre qui, à partir de cette ligne extrait le nom du fichier.
78
Chapitre 7
Les variables
7.1 Compétences visées
1. Définir une variable ;
2. Utiliser la valeur d’une variable dans une commande ;
3. Utiliser la valeur d’une variable dans une chaîne de caractères ;
4. Mettre le résultat d’une commande dans une variable ;
5. Utiliser les variables pour mettre les valeurs intermédiaires dans un enchaî-
nement de traitements ;
6. Utiliser des variables numériques.
7. Utiliser la variable status.
Jusqu’ici, nous avons parlé de shell sans nécessairement spécifier s’il s’agit de
sh, csh, ksh ou bash. De fait, la très grande majorité de ce que nous avons appris
juqu’ici vaut pour tous les shells. À partir du présent chapitre, certaines syntaxes
seront spécifiques au bash.
D’autre part, jusqu’ici, nos objectifs se sont limités à des tâches qu’on peut réaliser
avec une seule commande. Le fait de créer des variables revient à enregistrer les
résultats d’une commande pour les utiliser dans d’autres commandes. Ainsi, nous
nous dirigeons pas à pas vers la programmation en shell que nous verrons plus en
détail au chapitre suivant.
<identificateur>=<valeur>
De fait, un shell s’attend toujours à ce que l’utilisateur lui donne une commande
79
à exécuter. Les espaces lui permettent de séparer les commandes des options et des
arguments. Lorsque le shell détecte un ’=’ dans une commande, il reconnaît une
définition de variable. Ainsi, lorsque vous entrez :
sytaxe_correcte=3
syntaxe_incorrecte = 3
Atelier expansion :
heros="spider"
echo ${heros}
echo $heros
Les accolades ne sont pas obligatoires mais, dans certains cas, elles permettent
de lever des ambiguïtés.
80
Atelier expansion avec accolades :
heros=spider
echo $heros man
Jusqu’ici tout va bien. Et si on voulait coller les deux chaînes de caractères ? Quel
est le résultat de la commande suivante ?
echo $herosman
echo ${heros}man
En shell, par défaut, toutes les données sont de type chaîne de caractères. Donc,
dans la grande majorité des cas, il est inutile d’utiliser les guillemets.
En particulier les deux commandes suivantes :
var=guerre
var="guerre"
sont strictement identiques et équivalentes. Il en va de même pour :
var=1+2
var="1+2"
var="1"+"2"
Par contre :
film=Avengers Infinity War
produit un message d’erreur car le shell interprète cette ligne comme la commande
film=Avengers suivi de deux autres commandes Infinity et War (commandes qu’il
ne connaît pas). Alors que :
film="Avengers Infinity War"
permet de faire des trois mots une seule chaîne de caractères.
Les guillemets permettent de créer des chaînes de caractères contenant des es-
paces.
81
7.2.5 Les apostrophes et les guillemets
’ls’ : C’est celui qu’on utilise le plus couramment dans les textes en français ou en
anglais. On l’appelle apostrophe ou single quote en anglais.
`ls` : ces caractères sont appelés backquote ou backtick en anglais ou accent grave en
français.
Dans cette section, nous nous intéressons seulement à la première forme. Nous nous
intéresserons à la deuxième forme à la section suivante. De plus, je vous recommande
d’être extrêmement prudent quand vous copiez-collez des commandes depuis un do-
cument pdf comme celui qui vous êtes en train de lire : il arrive que, pendant ces
copier-collers, les apostrophes soient convertis en d’autres caractères. Je vous invite
donc à écrire ces apostrophes à la main.
prix=5
Substitution de commandes
$(cmd)
En regardant des scripts sur internet, on voit encore la syntaxe utilisant les back-
quotes : `cmd`, mais il s’agit d’une ancienne syntaxe. Je vous recommande d’utiliser
celle de l’encadré ci-dessus.
82
Atelier substitution :
fichiers=$(ls)
echo $fichiers
ou encore :
temps=$(date)
echo $temps
ou enfin :
1. En utilisant la commande grep -n, écrire une commande qui trouve, dans le
fichier notes.csv sur Moodle, la ligne où apparaît thomas et affiche ce nombre.
Puis, écrire une seconde commande qui utilise cette valeur pour mettre dans
le fichier notes3.csv la ligne concernant thomas ainsi que toutes les lignes
précédentes.
2. On imagine que le fichier notes.csv est fréquemment modifié. On souhaite en
faire des copies régulières avec, dans le nom de chaque copie, la date et l’heure
à laquelle la copie a été faite. Par exemple pour une copie réalisée le 4 novembre
2019 à 8 :15, le format doit être :
notes_2019_11_04_08_15.csv
83
La commande expr
Atelier expr :
Essayer les commandes suivantes :
1. expr 35+2
2. expr 35 + 2
3. expr 35 / 2
4. expr 35 * 2
5. expr 35 2
Atelier2 expr :
Soit une variable z dont la valeur est un nombre (Par exemple z=3). Écrire une
commande qui :
— augmente la valeur de cette variable de 1. Dans notre exemple, la variable
z devra valoir 4.
— double la valeur de cette variable. Dans notre exemple, la variable z devra
valoir 6.
L’expansion mathématique
Si vous utilisez bash ou ksh, alors toute expression placée entre (( et )) est
considérée comme une expression numérique.
— echo $(( 3 + 2 ))
— echo $(( 3 - 2 ))
— echo $(( 3 * 2 ))
— z=5
echo $(( z + 5 ))
echo $(( $z + 5 ))
— echo $(( $z < 5 ))
— (( z = z + 1 ))
84
7.4 La variable de status
La variable de status
— cat toto (où toto est un fichier qui existe dans le répertoire courant) ;
— cat toto (où toto n’existe pas dans le répertoire courant) ;
— cat toto (où toto n’est pas accessible en lecture) ;
— man ls | grep "command" ;
— man ls | grep "Spiderman" ;
— man ls > manls.txt
grep "spiderman" manls.txt
À votre avis, qu’est-ce qui explique ces valeurs différentes pour la variable de status
dans les deux derniers exemples ?
85
86
Chapitre 8
Dans ce chapitre, vous allez découvrir comment les différentes commandes que vous
avez apprises jusqu’ici pourront vous permettre d’écrire de véritables programmes
vous permettant d’automatiser les tâches répétitives.
87
3. Sauvegarder ce fichier, par exemple sous le nom premier.sh ;
4. Ensuite, dans un shell, placez-vous dans le même répertoire que celui du
fichier permier.sh ;
5. Donner à ce fichier les droits d’exécution pour vous-mêmes ;
6. Puis entrer la commande : ./premier.sh
7. Que se passe-t-il ?
Un script shell
Un script shell est un fichier texte contenant une suite de commandes shell. Si un
utilisateur a des droits d’exécution sur ce fichier, alors il peut utiliser ce fichier
comme un programme simplement en entrant le chemin du fichier dans un shell.
Le résultat de l’exécution est le même que si on avait entré chaque commande
dans le terminal.
Comme nous le verrons dans la section 8.7 et les suivantes, il est possible que le
script shell ne soit pas une simple séquence de commandes, mais soit organisée par
des structures de contrôle.
export TOTO=5
est une commande qui définit TOTO comme une variable d’environnement et donne
à cette variable, la valeur 5.
Comme pour les variables shell vues au chapitre précédent, il est important qu’entre
le nom de la variable, le caractère = et la valeur de la variable, il n’y ait pas d’es-
pace. L’expansion des variables d’environnement suit le même principe que celle des
autres variables. Souvent, pour les variables d’environnement, on choisit des noms en
majuscule.
env
est une commande qui affiche toutes les variables d’environnement définies dans
votre shell.
Est-ce que celle que vous avez définie en fait partie ? Pour supprimer une variable
d’environnement que vous aurez créée, vous pouvez utiliser la commande unset.
88
Supprimer une variable d’environnement
Entrer la commande :
unset TOTO
et assurez-vous que cette variable a été supprimée. Quelle commande utiliserez-
vous pour vous en assurer ?
Interroger les valeurs des variables suivantes et, d’après le nom de la variable et
sa valeur, devinez le sens de chacune :
LANG
PWD
SHELL
USER
HOME
PATH (nous en parlerons plus loin)
Atelier différences
89
Portée des variables :
1. La portée d’une variable shell se limite au shell où elle a été définie (terminal
ou script) ;
2. La portée d’une variable d’environnement englobe le shell où elle a été
définie (terminal ou script) ainsi que tous les processus lancés par ce shell.
En particulier, si vous ouvrez deux terminaux, le fait de définir une variable d’envi-
ronnement dans l’un ne la rend pas utilisable dans l’autre. Par contre, tout processus
(en particulier tout script shell) lancé par un shell hérite de toutes les variables d’en-
vironnement déjà définies dans le shell de ce terminal.
La variable PATH
90
Si le programme correspondant à la commande ne peut être trouvé dans aucun des
répertoires de PATH, alors le système rapporte : Command not found.
Vous avez sans doute remarqué que le répertoire courant ’.’ n’est pas, par dé-
faut, dans la variable PATH. C’est la raison pour laquelle, lorsque vous voulez lancer un
exécutable qui se trouve dans votre répertoire courant, vous ne pouvez pas tout sim-
plement entrer son nom (comme vous le fait pour d’autres commandes comme ls ou
python3. En effet, lorsque, dans votre répertoire courant, vous avez un programme
exécutable qui s’appelle permier.sh, vous devez entrer son chemin ./premier.sh
pour le lancer.
Est-ce que vous comprenez pourquoi, par défaut, on ne met pas le répertoire
courant dans PATH ? Remettre votre variable PATH à sa valeur initiale, ou changer de
terminal.
91
8.4 Ce qui suit un caractère #
À une exception (celle décrite au paragraphe 8.4.2), tout texte se trouvant entre
un caractère dièse # et une fin de ligne est ignorée par l’interpréteur shell. Comme
dans tout autre langage, je vous invite à ne pas vous priver de commenter vos scripts
pour qu’un autre programmeur, ou vous-mêmes dans quelques temps, puissiez mieux
lire ce script et comprendre les intentions et l’implémentation de votre programme.
8.4.2 Le Shebang
Comme vous l’avez vu au chapitre 1 de ce cours, bash n’est pas le seul langage de
shell. On avait évoqué d’autres shells comme sh (Bourne shell), csh (C-shell), tcsh
(Turbo C-shell) ou encore ksh (Korn shell).
Or il est important qu’un script écrit dans un langage donné puisse être lu par un
interpréteur du même langage, faute de quoi, certaines commandes ou structures de
contrôle seraient illisibles. Par défaut, le shell utilisé pour lire un script est celui défini
par la variable d’environnement SHELL. Sur les machines de l’UFR, il s’agit toujours
de bash. Donc tant que vous écrivez vos scripts en bash et que vous les exécutez sur
les machines de l’UFR, ces scripts seront lisibles. Par contre, si vous êtes satisfaits de
vos scripts et que vous les envoyez à des ami(e)s travaillant sur d’autres machines, où
le shell par défaut n’est pas le bash, ils pourront avoir des surprises.
C’est la raison pour laquelle il est utile de spécifier, dans le script même, le langage
shell qu’il faut utiliser pour interpréter ce script. C’est l’intérêt du Shebang. Il s’agit
de la chaîne "#!" placée en début de fichier et suivi du chemin du shell qui doit être
utilisé pour lire le script. Dans ce cours, nous avons choisi de travailler avec bash.
Donc je vous demande de commencer systématiquement tous vos scripts par la ligne :
#!/bin/bash
Ainsi, le script suivant donnera le même résultat que celui que vous avez écrit à
la section 8.2 et sera plus robuste et plus lisible.
#!/bin/bash
echo "HELLO!!"
# affiche la date
date
92
8.5 Les paramètres de position
De façon générale, les variables de position peuvent être définies dans différentes
situations :
— À l’appel d’un script, les variables de position prennent la valeur des arguments
du script ;
— À l’appel d’une fonction (que nous ne verrons pas cette année), les variables de
position prennent la valeur des arguments de la fonction ;
— Après la commande set, les variables de position prennent la valeur des argu-
ments qui suivent set.
Atelier somme
Écrire un shell script appelée somme.sh qui fait la somme de ses arguments. Par
exemple somme.sh 3 5 devrait afficher 8.
93
8.6 La variable status ou diagnostique d’un script
8.6.1 La commande exit
Un script se termine lorsqu’une des commandes du script rencontre une erreur
ou lorsque la dernière commande a été exécutée. Elle peut aussi se terminer avec la
commande exit, placée à la fin du script ou ailleurs.
8.6.2 Le diagnostique
Vous avez vu au chapitre précédent que, l’expression $? a pour valeur le status du
shell. Chaque commande, dans ce shell, donne une nouvelle valeur à cette variable.
Souvent cette variable sert de diagnostique.
— Si la valeur de cette variable est 0 cela signifie que la commande a été effectuée
avec succès ;
— Les différentes valeurs non-nulles peuvent indiquer différents types de dysfonc-
tionnements.
— Par défaut, le statut de sortie d’un shell script est celle de la dernière com-
mande du script ;
— Si la fin du shell script est due à la commande exit et que cette commande
est suivie d’un nombre, alors le statut de sortie du script sera égal à ce
nombre.
Ajouter une commande exit à la fin d’un de vos shell scripts de façon à ce que
le statut de sortie de ce script soit toujours de 5.
Dans les sections suivantes, nous allons voir les différentes structures de contrôle
du langage bash. Il en existe de très nombreuses sortes. Nous ne vous en montrerons
qu’un nombre limité. Nous privilégions les structures les plus répandues et insisterons
moins sur les structures propres à un seul langage.
Nous allons voir, plus loin, les formes que peuvent avoir les conditions.
94
Structures if-then-else
— Si <condition> est vérifiée, alors les commandes situées entre then et else
sont exécutées.
— Dans le cas contraire, les commandes situées entre else et fi sont exécutées.
Structures if-then-else
— Si <condition> est vérifiée, alors les commandes situées entre then et else
sont exécutées.
— Dans le cas contraire, ces commandes ne sont pas exécutées.
Voici les formes que peut prendre la condition. Ces conditions peuvent porter sur
des chaînes de caractères :
chaine1 = chaine2 condition vérifiée si les deux chaines de caractères sont identiques
chaine1 != chaine2 condition vérifiée si les deux chaines de caractères sont différentes
Elles peuvent porter sur des entiers :
entier1 -eq entier2 condition vérifiée si les deux entiers sont égaux
entier1 -ne entier2 condition vérifiée si les deux entiers sont différents
entier1 -gt entier2 condition vérifiée si entier1 > entier2 (gt signifie greater than)
entier1 -lt entier2 condition vérifiée si entier1 < entier2 (lt signifie less than)
On peut utiliser les opérateurs -ge et -le (au lieu de -gt et -lt) pour les inégalités
au sens large. Enfin, elles peuvent porter sur des chaînes de caractères interprétées
comme des noms de fichier ou répertoire :
-e toto condition vérifiée si toto est un fichier ou répertoire présent dans le répertoire courant ;
-f toto condition vérifiée si toto est un fichier régulier présent dans le répertoire courant ;
-d toto condition vérifiée si toto est un répertoire présent dans le répertoire courant ;
-r toto condition vérifiée si toto est présent et accessible en lecture ;
-w toto condition vérifiée si toto est présent et accessible en écriture ;
-x toto condition vérifiée si toto est présent et accessible en exécution.
Atelier conditionnel :
Reprendre votre shell script somme.sh et ajouter une condition au début du script
de façon à ce que si le nombre d’arguments du script est égal à 2, le script affiche
la somme des deux arguments et que, dans le cas contraire (else) il émette un
message d’erreur indiquant qu’il faut deux arguments et quitte avec un status de
1.
95
Le langage bash offre la possibilité d’utiliser les double crochets : [[ et ]] qui
offrent des possibilités très intéressantes mais qui n’existent que dans bash. C’est la
raison pour laquelle nous n’en parlerons pas. Vous verrez aussi, dans certains scripts,
les double parenthèses très intéressants pour les calculs numériques que nous n’utili-
serons pas non plus dans ce cours.
<sequence> est supposée être une suite de chaînes de caractères séparés par des
espaces, des tabulations ou des sauts de lignes. Dans ce cas, si <sequence> est com-
posée de n chaînes, alors la boucle for exécutera n fois <commandes>. À la i-ième
exécution, <var> sera égal à la i-ième chaîne de <sequence>.
Atelier séquences :
Écrire un shell script qui affiche un message contenant un nombre qui croît de 5
à 20. Par exemple :
Vous avez gagne 5 euros
Vous avez gagne 6 euros
Vous avez gagne 7 euros
...
Vous avez gagne 20 euros
96
Comme séquence, vous pouvez également mettre toute liste issue d’une commande.
Atelier for :
Atelier for ls :
Faire un shell script qui parcourt tous les fichiers réguliers du répertoire courant
qui ont une extension py et, pour chaque fichier, affiche le nom du fichier et son
nombre de lignes.
Atelier while :
Écrire un shell script qui exécute une commande 5 fois, mais en utilisant une
boucle while. Pour incrémenter un nombre, vous pouvez utiliser expr.
97
2. Ce script devra chercher, dans toute l’arborescence du répertoire courant, des
fichiers dont l’extension est *.py. Pour cela, utiliser la commande find en re-
dirigeant les messages d’erreur vers la poubelle ;
3. Ce script devra parcourir tous les fichiers issus de cette recherche et, si ces
fichiers sont lisibles, extraire la première ligne ;
4. Si cette première ligne contient la chaine from math import *, alors afficher le
chemin de ce fichier.
98