Vous êtes sur la page 1sur 178

MINIMAX

Des livres qu’on lit vraiment

Collection dirigée par Céline Chevalier

La ligne de commonde
par l’exemple
VINCENT FOURMOND

Développeur Debian
Ancien élève de l’École Normale Supérieure
Chargé de recherche au C.N.R.S.

En un clin d’œil

2. Kit de survie 17
1. Pourquoi utiliser la ligne de commande ? 11
3. Les outils de l’utilisateur 47
4. Gérer le temps et le réseau 73
5. Le shell à votre service 91
6. Les outils du sorcier 111
7 conseils 157
7. Lire et écrire des programmes 137
7 pièges à éviter 158
Comment trouver de l’aide ? 159
Et si l’on n’utilise pas bash ? 160
Lexique 165
Index 169
Installation de programmes 162
Je souhaite exprimer mes vifs remerciements à (dans le désordre) Jean-Julien
Fleck, Arnaud Borde, Stéphane Ravier, Vincent Danjean, Stéphane Tougard,
Marc Gingold, Sébastien Desreux, Walter Appel, Céline Chevalier, Emmanuel
Cornet et Jean-Baptiste Rouquier, qui ont participé par leurs relectures atten­
tives et leurs commentaires à l’élaboration de cet ouvrage.

Cet ouvrage est dédié d’une part à Tetyana, Simon et Christophe dans l’es­
poir qu’ils y trouvent la plupart des réponses aux questions qu’ils aiment tant
me poser et d’autre part à Sophie, Morgane et Elin, dans l’espoir qu’elles y
puisent matière à me poser des questions !

Fièrement libre !
Cet ouvrage a été entièrement réalisé avec des logiciels libres : IATEX, Zsh,
Bash, Tesh, Emacs, XFig.

ISBN 978-2-35141-072-1
Dépôt légal : mars 2013
© H&K
68 boulevard de Port-Royal, 75005 Paris
@ Imprimé par Book Partners China Ltd
Avant-propos

La ligne de commande: sous une apparence austère se cache un outil


d’une puissance et d’une efficacité remarquables, accessible à tous ceux qui
connaissent son language.
Muni de ce livre, vous apprendrez à gérer efficacement vos fichiers, mani­
puler vos documents, rechercher et mettre en forme des informations, effec­
tuer des sauvegardes, planifier des tâches, travailler à distance sur d’autres or­
dinateurs et bien d’autres choses. Mieux encore, vous apprendrez qu’en ligne
de commande, dès qu’on sait réaliser une opération une fois, la lancer des
milliers de fois ne prend que quelques instants : fini, les tâches répétitives et
rébarbatives ! Avec la ligne de commande, ce qui était une corvée devient un
mini-défi faisant appel à votre créativité : cent fois plus rapide, et autrement
plus intéressant !
Ce livre est organisé en chapitres de difficulté croissante, depuis les élé­
ments de base jusqu’à la combinaison de commandes et l’écriture de pro­
grammes. Il contient des exercices pour mettre directement en pratique vos
acquis, et un lexique, un index et un tableau récapitulatif des commandes
pour faciliter vos expérimentations.
La ligne de commande décrite dans ce livre est celle des systèmes Unix
(Linux, Mac OS X). Cependant, moyennant l’installation de la suite logicielle
(gratuite) Cygwin, vous pouvez retrouver un environnement et une efficacité
similaire sous Windows.
Pour vos débuts dans la ligne de commande, profitez de l’expérience de
quelqu’un qui l’utilise au quotidien depuis une dizaine d’années ; détendez­
vous, et suivez le guide !
J’espère que ce livre vous permettra de tirer le meilleur de la ligne de
commande et je vous souhaite autant de plaisir à le lire que j’en ai eu à l’écrire.

Bonne lecture !

Vincent Fourmond
Table des matières

Pourquoi utiliser la ligne de commande ? 11


1.1 D’où vient la ligne de commande?............000000cesescen es 11
1.2 Pourquoi utiliser la ligne de commande?...................…. 12
1.3 À qui s’adresse ce livre?.............…......100cca ccc ec nn nn 13
1.4 Les atouts de la ligne de commande....….........….………sesseus 14
1.5 Qu’entend-on exactement par « ligne de commande»? ......... 15
1.6 Les objectifs de ce livre................…..…sesesa se se se nn es 15
Kit de survie
2.1 Lancer une commande ..........044s0s00 00 se es es sn es 00en 0 e
a Ouvrirun terminal...........2444400 00000s a 000e 00es s000
b Linvite..........22020400000e n e e e e e e e e e e e e e nn 00e
2.2 Un exemple de commande: 18 ..........0000000senc sn un uus
a Arguments et OPtiONS .......0002000000 0 e e 0n e 00n 00000
b Et pourquoi pas 1ist?...........0.0.0000seesceea es sn ce nn e
2.3 Naviguer dans l’arborescence ................……cesenenaauess
a Le système de fichiers................0.0.000cccccacac nc es
b Lerépertoire courant ...….….….......0000000nena se sn en en 00en
c Lesattributs des fichiers.....................0000ses suu 0s
d _ Visualiser l’arborescence : tree ................0.0000000000
24 Lireunfichier ..........2200 2400s as se e e es 0 e 0 0 se es aaa se un e e
a Types et extensions .............0.0…00seenes nc n se cn 00es
b “Trouver le type d’un fichier: file...................0.0.000.
c Deux grandes familles de fichiers : « texte » et « binaire ».
d 1less: un lecteur de fichiers texte ................….…...
IRR @ == d A A A
2.5 Créer, renommer, copier et effacer ................….….….000ess

L @ ») = d S
b Renommer et déplacer ............00000s0saeasne sn cn ue

d Effacer...........222000000 0n e nn n e e e e e e e e e e e c0m e
e Enmasse...........2.04400 0500s s00e e u se en a e se nn cn nn e
2.6 Rechercher un fichier ..........0000000000 0s a ns en ec en e
a 1locate : recherche sur tous les fichiers............….......
b find:recherchelocale..................000esensa ns
2.7 Le Très Saint Manuel .........2022000 000es 000e sn e se s00000
TABLE DES MATIÈRES

a Anatomie d’une page de man ...............20sssssaa ce 39


b À quoi servent les pages de man?......................… 40
C Mman CÂP........0 s000 00en es ce n e e e e e e e e e e nn en e nn nn e e 41
2.8 Trois raccourcis indispensables .........1200000e cs sc es nn 42
a Tabulation : la complétion automatique .........…..….….………. 42
b Flèches verticales : historique des commandes ..…..…..….…...…. 43
c Copier/coller.................00000c ccs ee ns en n e se nn ue 43
Les outils de l’utilisateur 47
3.1 Créez-vous des liens! .............000002eeseaaa nn nc en e nn en 47
3.2 Quia le droit d’utiliser les fichiers? ..........2.La ccn es 48
a Utilisateurs et groupes ...s neasea nn n ue 48
b Autorisations...............0sese se se se nn n e nn en en es 49
c chmod : changer les permissions d’un fichier ............…. 51
d Permissions par défaut: umask...............….…...0sece es 52
3.3 Les fichiers avoueront tout ..................0.2cene sn na uun 52
a du: quelle place occupe un répertoire ....…......….….……... 53
b stat: tout, vous saurez tout sur un fichier ......….......…. 53
c wc: décompte des mots et des lignes .............….……….…… 54
d strings : extraire du texte de fichiers binaires..........…. 54
e diff : comparer deux fichiers...................0……0000es 55
3.4 C’est dans quel fichier, déjà ? .............202secsee nn aa uun 56
a 1setses options detri............0.0ssasase se en e un en 56
b find, deuxième prise .............222escenee nn sn nn nn 57
c grep: trouver les fichiers contenant un texte donné....……. 57
3.5 Compresser, sauvegarder, archiver ........…..…....…..000000ese 59
a gzip et compagnie : compression de fichiers uniques ... 59
b tar: l’archiveur du monde Unix .................00000000s 60
c Les archiveurs universels: zip, TZ ...........00000000c0es 63
3.6 Manipuler des images et des PDF ........12.220ea se a su nn 63
a Manipulation d’images avec ImageMagick ... 63
b Convertir un PDF en PostScript et vice-versa.....…..…..….…..…. 65
c pdftk: la « boîte à outils » des PDF ... 65
d pdfnup : « plusieurs pages par page»......….….….….…..….……….…………. 66
e pdfcrop: ajuster les marges d’un PDF ... 67
f pdfimages : extraire les images d’un PDF .......…....…...…. 67
3.7 Comment trouver le bon programme.......…..…..….………..….……..... 68
a …. S’il est déjà installé ............0.0000caaeeana se nn e 68
b … s’il n’est pas installé .............000000ccenea ns n nn 69
Gérer le temps et le réseau 73
4.1 Sessions shell distantes ..............000000ceaea se nn en n un 73
a SSH: un shell distant sûr...................00cenescan e 73
b Authentification par clé .........10202000casa se sn nn nn 75
4.2 Échanger des fichiers ..…...............ccennsssnnan nn 77
TABLE DES MATIÈRES 7
a scpetrsync:commesionyétait!.......…..…........…..... 77
b FTP: l’incontournable du transfert de fichiers........…...…. 79
43 LeWeb ...........2 22e e e e e e e e e e e e e e e e e e e e se nn e 81
a Le Web non-interactif ........202020002 020s se e e ec en en 81
b Navigateurs Web en mode texte............…........... 82
c Clients mail en mode texte ...............00000000000 suu 82
4.4 Letemps du calendrier..............…essesas se n se naa su es 83
a Ladateetlheure...........0.0.0000000e ccn es e es n sn 00e 83
b Uncalendrier..........2044400000ae se en es e en e e en 0 84
c Combien de temps prend une commande? .....…...….….….….…. 85
d Suivre l’évolution d’une commande ... 85
4.5 Planification de tâches ...........00000000000 e ec se a ns nn 86
a cron: exécution régulière de tâches.........…...…........ 86
b at: prévoir des commandes à l’avance ......…..….....…... 88
5. Le shell à votre service 91
5.1 De"AA”Z........2222 ce e e e e se e e e e e e e e e e e e 0 e e e e e en e S 91
a Raccourcis clavier courants.............000000000 05000000 91
b Gestion des commandes.................000000 sn e neu 0000 92
c Une autre approche des tâches de fond: screen ........…. 94
5.2 Lesalias .....1.2020000 2 es se e e e e e e e e e e e e e e e e se nn e 95
5.3 Les variables d’environnement..............00000000 00 se 0n e 99
a Changer de shell............00000000eeaee ce nc e n se ue e 100
b Le PATH, ou comment le shell trouve les commandes ....… 101
5.4 La gestion des langues ...…........essess se es es e nc s000e 102
a Les jeux de caractères ...s ene ccn en u es 102
b Les différents aspects d’une locale..........…............. 103
5.5 Les fichiers de configuration ...c eses cuu es 104
a Le fichier de configuration du shell...........000….... 104
b Voir la vie en couleur ...........02200000 0 cn e es e e en en 107
6. Les outils du sorcier 111
6.1 Rediriger les informations ............……esssces sn es e nn 00e 111
a >: rediriger la sortie ...........0000ene ce ne ce s0 se ue 111
b <:rediriger l’entrée..............000004eesea nn e 0 sn en u0 e 112
c Les deux flux de sortie ...c a nc nn en e 113
6.2 Enfiler des programmes comme des perles.........…...….…..….... 114
à « ; »: juxtaposer des commandes ...s 114
b &&et | | : enchaîner des commandes sous conditions ....…. 115
c | : faire dialoguer des programmes........….…...….….…...... 115
6.3 Filtrer les informations.............esea se se nc 000 116
a Unfiltre? .........20000 00e e e e e e e se e es e e e se ns en 0 116
b Les filtres les plus courants ............0000000000 ce nc en es 117
c Utiliser l’entrée standard comme argument .............…. 120
d Exécution massive de commandes avec xargs ......…..…..…. 121
8 TABLE DES MATIÈRES
e Stage intensif de plomberie...................0s0ssssasess 123
6.4 Du bon usage des guillemets .............080000ssassas se uus 125
6.5 Globs et expressions régulières ............00000sass se es su 0n e 126
a Petit retour sur les globs.............00….…0.sesa cs se cs uus 126
b egrep: recherche avancée de texte ....….….…..…....….….….….….….….……. 127
C sed: manipulation de textes..............….….….….…….……………s0…s 131
d rename : renommage en masse de fichiers ...........…...…. 133
7. Lire et écrire des programmes 137
7.1 Écrire un programme ................0…sccaa ccs ce es nc nn e 00 137
7.2 Lesvariables .........0..00000 00es e e es e e 0 e e e e e en nc 0 n e 139
a Définition et utilisation des variables...............….………. 139
b Que faire quand ça ne marche pas?...........….….….….….….………. 140
c / Les paramètres positionnels ............…..….….0ssssseu su se 141
d Utilisations avancées des variables ... 143
e FEt les variables d’environnement? ..............0000000000 144
7.3 Lestests ....….…......0...000000 cu 0s P 145
a if/then/else/fi : exécutions conditionnelles ........... 145
b Tests entre crochets...............000000 ec su 0s s00 n 00000 146
Cc case/esac : sélection par des valeurs ...........…...…..... 148
d Etl’option en premier? ............0200sses se ns nn se se e 149
7.4 Lesboucles.............0200000000 0s e e se en e e e es e nn s0000 e 150
a while : répéter tant qu’une condition est remplie ....…..….…. 150
b for : répéter pour une liste de valeurs................. 152
c for en ligne de commande ... 0050s sas cs ses su 153

77 pièges
conseils 157
7.5 Un exemple complet : n’oubliez plus les anniversaires! .....….……. 153
7.6 Pouraller plus loin ...........00102sas se n se ns es se se ns en en e 155

à éviter 158
Comment trouver de l’aide ? 159
Index 169
Lexique 165
Et si l’on n’utilise pas bash ? 160
Installations de programmes 162
. OU source lit et exécute un fichier de commandes ............000000essesnana ue 96
[outest effectue des tests .............00000ee se e e se se e se n en e es nc nn nn e 146
7z archive fichiers et répertoires ..................csesesnasna ec ne 00 63
alias définit un alias, ou montre un alias existant ....................... 95
apropos cherche des mots-clés dans les pages de man ...….......…....……….….…….. 68
at exécute une commande plus tard ................…000sseese en ec ue 88
basename affiche la partie « nom » d’un chemin ...............00000cec ccn n en 143
bg redémarre une commande interrompue en tâche de fond ..…....….…..…. 93
bunzip2 restaure un fichier .bz2 ............002020000 es ne n e ec se en e e rn en u0» 60
bzip2 compresse un unique fichier ...................000ecssse ec en scc 0 00s 59
bzcat envoie le contenu d’un fichier .bz2 dans le terminal ... 60
bzless lit avec 1ess le contenu d’un fichier .bz2 ... 60
cat affiche un ou plusieurs fichiers à la suite dans le terminal ... 112
cd change de répertoire courant ...........….….…0a0ssaanss se se se ce se 000s 23
chgrp change le groupe d’un fichier ............0.00020ce e se es se se s000e 52
chmod change les permissions de fichiers/répertoires ... si
chsh changer de shell par défaut ...............0..sreesee se nn e ce sn ccn 00 100
convert convertit/transforme des images ...............000000ene nn cnc u00e 63
cp copie fichiers et répertoires ...….…........………sesesseses se en e se nn e 000e 32
crontab gère les tâches planifiées de cron ..............00s0secncnen ce uus 86
curl affiche le code source d’une page web ..................00secnecn uus 81
cut découpe les lignes de son entrée standard ..…..........…....……seesee 118
date affiche la date ............2220 ce se se se n e es e e e e en n e en n e en n en n 83
df affiche l’espace occupé/disponible sur tout le système ...…...…….…...…. 53
diff différences ligne par ligne entre deux fichiers ... 55
dircolors ajout des couleurs dans 1s ...........0000000eases cec uun es e nn ue 107
dirname affiche la partie « répertoire » d’un chemin ... 143
disown rend une tâche de fond résistante à la fin du shell .............….…..…. 93
display affiche des images .............000000 00en sn n e en se en nn en nn e e 65
du affiche l’espace occupé par un répertoire ...…........…..…..…….…..…….….………….. 53
echo affiche ses arguments ...........0000000e0na se en e se e e en en en nn nn n e 99
env affiche toutes les variables d’environnement ... 100
epstopdf convertit un PostScript en PDF .........20020s sc es sn es en es en en 000 65
exit quitte le shell en COUrs .............002040 000e e n en e en se e en e sn nn 74
export définit une variable d’environnement .........…......00000000 ce es 100
fg redémarre une commande interrompue au premier plan .....….………..…. 93
file affiche le type d’un fichier ............00020saesss se nn e en e e es nn e 00 e 27
find trouve des fichiers ..............00000000 se e e se se se e en sn n e sn nn 38
from affiche les résumés des mails locaux ..…............…...……essesecenee es 86
grep trouve du texte dans des fichiers ..................…..……sseesen cec es 57
groups affiche les groupes dont vous faites partie ... 49
gunzip restaure un fichier compressé par gzip ....…..........…….…0esseueeu se 59
gzip compresse un fichier et supprime l’original ....................... 59
head n’affiche que les premières lignes de son entrée standard .........…. 117
iconv convertit du texte entre différents jeux de caractères ......…..….….…..…. 103
jobs dresse une liste des commandes du shell en cours .........….….…….…….. 93
KiFl termine une commande en cours (par son numéro de tâche/PID) ....93
killall termine une commande en cours (par son nom) .....….…..….…..….….….…...... 94
less pour lire un fichier texte .................00000000 se nn en ec 0s e nn c0000 29
locate recherche des fichiers dans toute l’arborescence ... 37
In -s crée un lien symbolique ................0...000500 se se es se se ns c nn c0» 47
locale affiche des informations sur les locales (en vigueur ou disponibles) .102
1s affiche le contenu d’un répertoire ..…...…..…......…ssssaessessanen es 18
10 TABLEAU RÉCAPITULATIF DES COMMANDES

1zcat envoie le contenu d’un fichier .1zma dans le terminal ...….....….…...…. 60


1zma compresse un fichier et supprime l’original ... 59
mail envoie un message électronique ...............………esssassaen es 112
man affiche l’aide en ligne d’un programme ...s cacnane n 39
montage crée un index d’images ............000000eeaea n es se nn sn e se nn cec 65
mplayer lecteur multimédia en ligne de commande ....…..…...........0…0…00c0ese 98
mv déplace/renomme fichiers et répertoires ...c 32
ncal affiche un calendrier ...........206se es es se asa se sé en é e en es en ns nn 84
ncftp client FTP interactif .........02000000 000s en se en e en e es a se es s00e 79
ncfîtpget télécharge un fichier sur un serveur FTP ................000esec uuc es 80
nl numérote les lignes de son entrée standard ... 117
nohup lance une commande qui persiste après la fin du shell ....…......…...…. 94
pdfcrop redimensionne un fichier PDF pour enlever les marges .…....…..…..…..…..…. 67
pdfimages extrait les images bitmap contenues dans un document PDF ....….….……. 67
pdfnup arrange un document PDF en plusieurs pages par feuille ..…....…..….….……. 66
pdftk effectue toutes sortes d’opérations sur des PDF ... 65
pdftops convertit un PDF en PostScript ...........…essenenessnna es 65
ps dresse une liste de toutes les commandes en cours ......…....….………….….. 94
ps2pdf convertit un PostScript en PDF .........2000sscssesa ns en n cec se cnc 00es 65
pwd affiche le nom du répertoire courant ...c cc ce en en e 22
readlink lit le chemin désigné par un lien symbolique .......…...…....…….….….….... 48
rename renomme des fichiers selon une règle ................….sccncuese 133
rm supprime fichiers et répertoires ...s ssa sc en nn nn 33
rmdir supprime les répertoires vides ..............enesseases ns e ue cs 34
rsync synchronise des répertoires ................….00ssesasee sn nc c se ue un 78
scp copie des fichiers vers/depuis une machine distante ...…..…..…..….……..…. 77
screen gestion avancée de commandes .............0.000seesaea ce sn sc nc es 94
set change les options du shell ....…........00000srcesa ns e e se e ns scc e 00 106
shift décale les arguments positionnels ...….........…….….…senseseensaunes 150
sort trie les lignes de son entrée standard ..................….…essaese en 118
ssh ouvre une session shell sur un ordinateur distant ... 73
ssh-add débloque sa clé SSH pour la session en COUrs ..….……….….….....….….…….….….... 77
ssh-copy-id copie sa clé publique sur un ordinateur distant .........….......... 76
stat affiche des informations détaillées sur un fichier ... 53
strings extrait le texte de fichiers binaires ...................eseesssecuen se 54
tail n’affiche que les dernières lignes de son entrée standard ......….…..……. 117
tar archive fichiers et répertoires ................……esseseneanes se e us 60
tee sauve une copie de son entrée standard ...........……...….……..….... 120
time mesure le temps que prend une commande ....….................... 85
tree représente une arborescence de fichiers ... 26
type indique si une commande est une commande interne ........…..….….….……. 41
umask change le masque pour les permissions par défaut des fichiers ....…. 52
unalias supprime un alias ..............0000000 ec n e e e en es e e e e es e n e se s00 96
uniq supprime les lignes consécutives identiques de son entrée standard .119
unlzma restaure un fichier .1ZmA .........00000ssas se e sé sn e e nn e e se n a 00 60
unzip restaure le contenu d’une archive créée par zip .......….….….….….….….….…. 63
uptime affiche le temps depuis lequel l’ordinateur est allumé ... 85
watch suit l’évolution du résultat d’une commande .............…..………….…….. 85
wC calcule des statistiques sur un fichier texte ............….….…..….….….……….……. 54
wdiff différences mot par mot entre deux fichiers ... 56
wget télécharge une page web ............aass se nc sn es sn en en se e se nn en » 81
xargs prépare et exécute des commandes à partir de son entrée standard .121
zcat envoie le contenu d’un fichier compressé par gzip dans le terminal ..59
zless lit avec 1ess le contenu d’un fichier compressé par gzip ......…...……. 59
zip crée une archive ....…........essa se se e en se ns r es en es es es en se cu se 63
zipinfo affiche le contenu d’une archive créée par zip ......…...….….......…... 63
Pourquoi utiliser
la ligne de commande ?
Chapitre

La ligne de commande effraie et fascine en même temps: la suite de sym­


boles semblant attendre que l’on tape quelque chose réveille l’angoisse de la
page blanche. Quels mystères sont enfouis derrière cette interface d’apparence
aride ? Quelle puissance obscure recèle-t-elle ?
S’il faut un effort certain pour apprivoiser la ligne de commande et tirer
parti de sa force, elle vous le rendra au centuple : nombre d’opérations que
vous considériez fastidieuses, voire impossibles, se révéleront faciles, rapides,
et même amusantes !

1.1 D'où vient la ligne de commande ?


Les premiers ordinateurs n’avaient pas d’interface à proprement parler :
on entrait directement l’intégralité du programme que l’on souhaitait exécu­
ter via des cartes perforées ou des rubans, et l’ordinateur en donnait le ré­
sultat. Ce n’est qu’avec l’avènement des systèmes de stockage et des fichiers
qu’est apparu le besoin de choisir les programmes à exécuter et de gérer les
fichiers qu’ils produisaient. Pour ce faire, les informaticiens ont conçu des
programmes spécifiques, les interpréteurs de commandes, qui reçoivent des
commandes tapées au clavier et les exécutent. Ces commandes sont des pe­
tites phrases écrites dans un langage minimaliste compris par l’interpréteur
de commandes. Il suffit d’apprendre ce langage pour dialoguer avec la ma­
chine. En voici quelques exemples :
convert image.jpeg image.png
Cette « phrase » demande à l’interpréteur de lancer le programme convert, qui
se charge de convertir l’image image . jpeg, au format JPEG, en une image au
format PNG nommée image .png.
rename -v ’s/image(\d+)/$1image/? *
permute image avec le nombre qui le suit dans le nom de tous les fichiers, en
affichant comment chaque fichier est affecté par cette transformation.
find . -mmin -10 | xargs cp -t Recents
envoie dans le répertoire « Recents » une copie de tous les fichiers modifiés
au cours des dix dernières minutes.
Les ordinateurs ont ensuite longtemps été cantonnés à des interfaces en
mode texte uniquement. Puis, la popularisation par Apple des premiers sys­
tèmes d’exploitation « graphiques », suivie par les débuts de Windows, ont
amorcé la transition d’une ère du « tout clavier » à celle actuelle du « tout sou­
ris », où la plupart des opérations simples sont réalisables en quelques clics
bien placés.
12 CHAPITRE I — POURQUOI UTILISER LA LIGNE DE COMMANDE ?

« Tout souris » ? Pas complètement : les descendants des premiers interpré­


teurs de commande sont toujours développés activement à l’'heure actuelle,
et ils sont encore utilisés par de nombreux adeptes. Par exemple, les hackers
des films sont toujours en train de taper furieusement des commandes cryp­
tiques sur des terminaux en mode texte!. Sans donner dans le cliché, la ligne
de commande reste l’outil de choix pour les administrateurs système, bon
nombre de programmeurs, ainsi qu’une proportion importante de ces utilisa­
teurs qui, sans être des professionnels, cherchent à exploiter au maximum les
possibitités de leur ordinateur.

1.2 Pourquoi utiliser la ligne de commande ?


Pourquoi ces irréductibles persistent-ils à utiliser cet outil d’apparence si
archaïque à l’ère du multimédia ? Ce n’est certainement pas par nostalgie :
les interpréteurs de commandes ont beaucoup évolué depuis l’ancien temps.
Cherchons donc ailleurs. Qu’est-ce qui peut pousser quelqu’un à préférer taper
des commandes au lieu de cliquer sur des icônes ?
Ce qui fait la force des interfaces graphiques actuelles, c’est qu’avec la sou­
ris, il est facile de choisir un ou quelques éléments parmi un petit nombre :
sélectionner un fichier parmi une trentaine dans un explorateur ou cliquer sur
l’un des quelques liens d’une page Web. Ce type d’interface est amplement
suffisant pour des besoins modérés. Mais dès qu’il s’agit de fouiller à grand
renforts d’ascenseurs dans une hiérarchie complexe de fichiers, d’aller cher­
cher la 1252° photo d’un répertoire parce que c’est justement celle qui nous
intéresse, ou de sélectionner un grand nombre de fichiers selon certains cri­
tères, la frustration s’installe rapidement, surtout si après avoir passé quelques
minutes à sélectionner avec précaution une série de fichiers, on a le malheur
de cliquer une fois de trop et de perdre toute la sélection… Nous avons tous
été confrontés un jour ou l’autre à ce genre de désagréments. Le fait est qu’il
n’y a précisément pas de solution graphique à ces problèmes : la souris est un
mode d’expression limité qui ne convient que pour des besoins précis, pour
lesquels des programmes spécifiques ont été écrits, ou bien pour des tâches
graphiques”.
Certes, utiliser des raccourcis clavier peut grandement faciliter certaines
tâches et permet ainsi de reporter les limites tolérables de la frustration un peu
plus loin. Cependant, même avec leur aide, il reste difficile, voire impossible,
d’exprimer des idées très naturelles, comme « tous les fichiers au format PDF ».
La ligne de commande est exempte de ces tares. Le mode d’expression
qu’elle emploie, plus proche du langage humain, permet de faire passer des
idées beaucoup plus complexes. Si l’on devait comparer la souris et le cla­
vier aux différents modes de communication entre êtres humains, la souris
1. Et non, curieusement, en train de cliquer à gauche et à droite sur un écran.
2. Personne ne contredira le fait qu’il est sensiblement plus facile de dessiner à la souris qu’au
clavier — sauf dans le cas de fonctions mathématiques.
I.3 — À QUI S’ADRESSE CE LIVRE ? 13
s’exprimerait uniquement par gestes - et les raccourcis claviers seraient des
grognements - alors que le clavier parlerait un véritable langage, légèrement
différent du nôtre. Ainsi, en ligne de commande, sélectionner un fichier parmi
un million n’est pas plus long que parmi une dizaine, puisqu’on l’appelle par
son nom. C’est d’autant plus facile que l’on peut compter sur un système
de complétion automatique qui se charge de taper pour vous toutes les par­
ties « évidentes » du nom du fichier ; nous y reviendrons au chapitre suivant.
Cette même complétion automatique permet de traverser très rapidement une
hiérarchie complexe de fichiers. Par ailleurs, plus de risque qu’un clic malen­
contreux vous fasse perdre deux minutes passées à sélectionner des fichiers,
d’autant plus qu’il ne vous faudra généralement que quelques secondes pour
sélectionner les mêmes fichiers en ligne de commande, grâce à une notation
simple et efficace.
Indépendamment de ces avantages indéniables, la ligne de commande per­
met de réaliser simplement et rapidement* des opérations qui serait autrement
très fastidieuses et répétitives, voire impossibles, comme :
— créer une sauvegarde de tous vos fichiers modifiés cette semaine :
— extraire la première page d’une série de fichiers PDF pour en faire des
images ;
- redimensionner une série d’images et leur ajouter une notice de copy­
right pour les diffuser sur une page Web ;
— classer des dossiers en fonction du nombre de chansons, d’images ou de
documents qu’il contiennent ;
— télécharger d’un coup les cibles de tous les liens contenus dans un mes­
sage électronique (ou n’importe quel autre texte) ;
— renommer rapidement les fichiers d’un dossier selon une règle simple.
Les possibilités sont illimitées : imaginez l’effet de passer d’une communication
rudimentaire à un vrai discours élaboré !
Par ailleurs, l’utilisation de la ligne de commande est indispensable dans
certains cas, en particulier lors de connexions distantes à un autre ordinateur,
S’il est possible d’utiliser des interfaces graphiques à distance grâce à des pro­
tocoles spécialement étudiés, ces derniers sont par essence plus gourmands
en ressources réseau*. Pour une connexion lente, le dialogue est nécessaire­
ment plus fluide en ligne de commande.

1.3 À qui s'adresse ce livre ?


Ce livre s’adresse à tous ceux qui se sentent parfois limités et frustrés par
les interfaces graphiques, et qui aimeraient découvrir une autre manière d’uti­
liser leur ordinateur. Il s’adresse aussi aux utilisateurs réguliers de la ligne
3. Il s’agit de votre temps, pas de celui que l’ordinateur va y passer, mais ce dernier ne connaît
ni l’ennui, ni la rébellion.
4. De plus, ces protocoles ne sont pas forcément autorisés par l’hôte distant.
14 CHAPITRE I — POURQUOI UTILISER LA LIGNE DE COMMANDE ?

de commande qui sentent qu’ils n’exploitent pas au maximum les possibilités


offertes-par cette dernière”. Enfin, il y a fort à parier que même les gourous de
la ligne de commande y trouveront des idées intéressantes ! - ‘

1.4 Les atouts de la ligne de commande


Il est vraisemblable qu’apprivoiser la ligne de commande changera défini­
tivement votre perception des ordinateurs. Pour vous aider à faire ce pas, voici
quelques-uns des avantages dont vous bénéficierez :
Rapidité : avec un peu d’habitude, vous vous rendrez compte qu’en réalité,
il est toujours plus rapide d’utiliser la ligne de commande qu’une interface
graphique fournissant des fonctionnalités équivalentes.
Expressivité : le langage de la ligne de commande permet d’exprimer ef­
ficacement des idées complexes de manière compacte. Si les ordinateurs ont
du mal à nous comprendre directement, il nous est en revanche très facile
d’apprendre un langage qu’ils comprennent.
Automatisation : si l’on sait effectuer une opération une fois, il est très
simple de la réaliser un grand nombre de fois sans avoir à le faire manuelle­
ment. C’est l’ordinateur qui doit travailler pour vous et non le contraire !
Personnalisation/optimisation : il est très facile de créer des « raccour­
cis » pour les opérations que l’on effectue couramment: pas besoin de taper
l’intégralité des commandes à chaque fois. Avec le temps, vous pourrez ainsi
bâtir un environnement spécialement adapté à vos besoins.
Puissance : la ligne de commande permet de combiner efficacement des
opérations élémentaires pour réaliser des opérations complexes. L'interpré­
teur de commandes est en réalité un véritable langage de programmation se
prête facilement à l’écriture de programmes élaborés. Par ailleurs, il existe de
nombreux programmes utilisables en ligne de commande pour réaliser toutes
sortes de tâches, comme l’envoi automatique de courriers électroniques, la
manipulation d’images, de vidéos, de données scientifiques…
Coexistence avec les interfaces graphiques : rien ne vous oblige à aban­
donner votre interface graphique pour passer à la ligne de commande. Les
deux peuvent en effet coexister de manière pacifique sur votre ordinateur.
Mieux, ils peuvent même coopérer: de nombreux programmes graphiques
fournissent des moyens simples de les piloter en ligne de commande. On peut
ainsi lancer l’ouverture d’une série de documents ou de pages Web, choisir les
prochaines chansons que l’on va écouter.….
Rentabilité : l’apprentissage de la ligne de commande est un investisse­
ment à long terme - s’il est vrai les premiers essais seront longs et laborieux
par rapport à l’utilisation de votre interface graphique favorite, cette tendance
va peu à peu s’inverser, et vous vous demanderez bientôt comment vous avez
pu supporter de perdre autant de temps avec une interface graphique !
5. C’est le cas par exemple si vous ne savez pas comment réaliser toutes les opérations men­
tionnées page précédente.
15 — QU‘ENTEND-ON EXACTEMENT PAR « LIGNE DE COMMANDE » ? 15

1.5 Qu'entend-on exactement par « ligne de commande » ?


La ligne de commande est constituée de plusieurs éléments intimement
liés. Au cœur se trouve l’interpréteur de commandes, que l’on appelle cou­
ramment SHELL, Comme en anglais. C’est lui qui déchiffre ce que vous tapez
et se charge de lancer les programmes correspondants ; c’est donc lui qui est
déterminant pour le confort de l’utilisation de la ligne de commande. Les trois
shells les plus couramment utilisés sont bash, tcsh et zsh“. Ces shells sont do­
tés de fonctionnalités avancées : édition, historique, complétion automatique…
Nous centrerons notre propos sur bash, qui est le shell par défaut sur toutes
les distributions Linux, ainsi que sur Mac OS X”. Les autres shells n’en diffèrent
que par des détails, que nous avons rassemblés dans une annexe page 160.
Le shell traite vos commandes en faisant appel à des utilitaires de base
présents dans tous les environnements de type Unix, définis par la norme PO­
SIX: Linux, Mac OS X, toutes les variantes d’Unix (HP-UX, IRIX, Solaris, etc.),
et même sous Windows si l’on installe la suite d’applications Cygwin®. Ces ou­
tils permettent des manipulations de fichiers et de textes. Combinés au shell,
ils forment un véritable langage de programmation.
À cela s’ajoutent les programmes installés sur votre ordinateur, qui peuvent
tous être invoqués en ligne de commande. Même si ceux-ci ne font pas partie
des utilitaires standard, il peuvent révéler une puissance insoupçonnée lors­
qu’ils sont combinés avec la ligne de commande.
La ligne de commande et les logiciels libres
Un grand nombre des logiciels qui constituent la ligne de commande,
comme les shells et les utilitaires de base, sont des programmes développés
selon le modèle des LOGICIELS LIBRES : leur code source est disponible pour
tous, et ils sont souvent distribués gratuitement. Pour une part importante,
les contributeurs de ces projets sont des programmeurs passionnés béné­
voles ; ceux-ci ont une certaine tendance à préférer ajouter de nouvelles
fonctionnalités à leurs logiciels plutôt que passer du temps à en peaufiner
la documentation ou à le traduire dans d’autres langues. Gardez ceci à l’es­
prit lors de vos pérégrinations dans la ligne de commande !

1.6 Les objectifs de ce livre


Apprivoiser la ligne de commande demande de repenser sa manière d’in­
teragir avec l’ordinateur. Pour faciliter cet apprentissage, nous avons organisé
ce livre en chapitres de complexité croissante, depuis les rudiments jusqu’aux
incantations avancées. Comme pour l’apprentissage d’une langue vivante, il est
indispensable d’appliquer ses nouveaux acquis à des cas concrets pour progres­

6. Dans cet ordre, d’après les statistiques d’utilisation rassemblées sur popcon .debian.org,
7. Les premières versions de Mac OS X utilisaient tcsh comme shell par défaut.
8. Que l’on peut télécharger gratuitement à l’adresse vww.cygwin. com.
16 CHAPITRE I — POURQUOI UTILISER LA LIGNE DE COMMANDE ?

ser. C’est pourquoi nous vous recommandons de consacrer un peu de temps


à la mise en pratique de chaque chapitre avant de passer au suivant.
Le chapitre 2, « Kit de survie », est un passage obligé : dans la suite, nous
supposerons que ce qui s’y trouve est acquis. Les chapitres 3 à 5 sont de diffi­
cultés comparables et peuvent être lus indépendamment. Les chapitres 6 et 7,
« Les outils du sorcier » et « Lire et écrire des programmes », supposent une cer­
taine familiarité avec les concepts et les commandes des chapitres précédents.
Vous trouverez à la fin de cet ouvrage un récapitulatif des conseils les plus
précieux et des erreurs les plus courantes. Un index vous permet de retrouver
facilement les concepts et les exemples d’utilisation des divers programmes
présentés dans ce livre, et un lexique contient la définition des termes les
plus importants ; ceux-ci sont indiqués au fil du texte en PETITES CAPITALES.
De plus, nous avons préparé un tableau récapitulatif des commandes utilisées
dans ce livre page 9 ; si un exemple fait appel à une commande qui vous est
inconnue, c’est là qu’il faut la chercher.
Nous avons enfin isolé trois annexes : une où l’on explique comment trou­
ver de l’aide, une autre sur les shells les plus couramment utilisés et leurs prin­
cipales différences, et une dernière dans laquelle nous présentons quelques
rudiments d’administration système, et en particulier les méthodes pour ins­
taller les programmes qui seraient absents de votre système.
Avertissement
Les logiciels qui forment la ligne de commande existent en de nombreuses
versions offrant des fonctionnalités différentes. Il est donc possible que les
programmes que vous utilisez ne se comportent pas exactement comme ce
qui est décrit ici, en particulier si vous utilisez Mac OS X. Les cas génants
seront indiqués par des notes de bas de page.
Kit de survie
Chapitre

> Prendre en main le shell

Objectifs
> Observer : naviguer dans la hiérarchie, lire et rechercher des fichiers
» Modifier : déplacer, copier et supprimer fichiers et répertoires

Les outils de la ligne de commande sont pré-installés sur toutes les ma­
chines Linux, Mac OS X ou Unix ; nous allons d’abord vous montrer où les
trouver sur votre ordinateur, puis comment les utiliser pour les opérations
de base.

2.1 Lancer une commande


a. Ouvrir un terminal
La ligne de commande fonctionne uniquement en « mode texte » : on tape
du texte et l’ordinateur répond avec du texte. Pour l’utiliser, il est indispensable
d’ouvrir un TERMINAL, OÙ CONSOLE, c’est-à-dire un programme qui permet cette
interaction au sein d’un environnement graphique : il dirige les entrées au cla­
vier vers le shell et affiche les réponses.
Comment lancer un terminal
GNOME cliquez sur « Terminal » (@B) du menu « Accessoires »
KDE cliquez sur « Système/Konsole » ( ou #) du menu K.
Mac OS X _ ouvrez l’application « Applications/Utilitaires/Terminal »
En général cherchez à ouvrir une application nommée « XTerm »,
« ÂTerm », « ETerm », « Terminal », « Konsole », etc.

b. L'invite
Le terminal s’ouvre. Il se présente sous la forme d’un grand rectangle
ne contenant, au début, qu’un petit texte en haut à gauche, que l’on appelle
l’INVITE, OU PROMPT en anglais. Ce texte signifie « je suis prêt, j’attends une
commande ». Sa teneur exacte varie d’un shell à un autre et d’une configura­
tion à une autre. Parmi les plus courants, on peut citer « < », « # », « % », « > »,
«$», «totoro - », OÙ totoro est le nom de l’ordinateur.
Quelle est la différence entre shell et terminal ?
Le terminal se borne à permettre l’interaction avec le shell en lui transmet­
tant les entrées clavier de l’utilisateur et en affichant ses réponses. À son ou­
verture, il lance le shell favori! de l’utilisateur. C’est ce dernier qui se charge
d’interpréter les commandes et de les exécuter.
18 CHAPITRE 2 — KIT DE SURVIE

Commençons par déterminer le shell utilisé par votre terminal. Pour cela,
tapez le texte « echo $0 »* à côté de l’invite, représentée ici par %. Appuyez
alors sur la touche Entrée! pour lancer la commande :
% echo $o0 — La commande
bash La réponse
% Tant que l’invite n’a pas reparu, la commande n’est pas encore finie !
Une ligne s’affiche (le résultat de la commande, ici bash) suivie par une nou­
velle invite qui indique que la commande précédente est terminée et que
le shell est prêt à en exécuter une nouvelle. Selon votre configuration, cette
commande répond bash, zsh, tcsh, etc. Il s’agit du nom de votre interpré­
teur de commandes. En ce qui concerne les chapitres 2 à 4, tous les shells
sont équivalents ; pour la suite, reportez-vous à l’annexe page 160 si ce n’est
pas bash.
Utilisez les touches usuelles pour éditer la ligne de commande en cours :
flèches gauche (:—l) et droite (:;}), touches de suppression ( ne……èœg et
Ëpä), début (ÎDÏ5£) et fin (}i—n};ÿ) de ligne. Nous présenterons d’autres raccourcis
très pratiques page 42.
Majuscules/minuscules

2.2 Un exemple de commande : 1s


Commençons notre exploration des commandes par « 1s », qui est l’abré­
viation de list (« faire l’inventaire de », en anglais). Cette commande affiche
le contenu d’un RÉPERTOIRE (Ou « DOSSIER »). Comme elle ne modifie aucun
fichier, son utilisation est sans risques : une fausse manœuvre est sans consé­
quences.

a. Arguments et options
Voici plusieurs façons d’utiliser 1s :
% 1s Affiche le contenu du répertoire courarct
Admin Chansons H&K Programmation
1. Si votre shell par défaut ne vous convient pas, nous verrons page 100 comment en changer.
2. La commande echo se contente d’afficher du texte, nous la décrirons page 99. Par ailleurs,
les $NOM sont des variables d’environnement, nous y reviendrons page 99. Enfin, la variable
spécifique $0 contient le nom du shell utilisé ; elle sera détaillée page 141. On aurait aussi pu
utiliser echo $SHELL, qui affiche votre shell par défaut (voir page 100) ; cependant, ce dernier
peut être différent de celui lancé par votre terminal.
3. Sauf Mac OS X, qui, en général, ne fait pas la différence entre minuscules et majuscules.
2.2 —- UN EXEMPLE DE COMMANDE : LS 19

Affiche.jpeg debian.htm1 LaTeX


article.pdf =— doc.tar.gz — mail
% 1s Admin — Affiche le contenu du répertoire Adynin
Comptes.xml Impots
1s affiche le contenu du RÉPERTOIRE COURANT (voir page 22) ou celui du ré­
pertoire donné sur la ligne de commande, son ARGUMENT.
La plupart des commandes peuvent naturellement travailler sur plusieurs
arguments en même temps :

% 1s Admin LaTeX — Affiche le contenu des répertoires


Admin: Adyain et Latex
Comptes.xml Impots
LaTeX:
utils.sty
Nous vous signalerons systématiquement quand ce n’est pas le cas.
Par défaut, 1s n’affiche pas les fichiers dont le nom commence par un point
car ces derniers sont par convention « CACHÉS » dans le monde Unix: un pro­
gramme se doit de les ignorer à moins qu’on lui demande explicitement le
contraire. 1s les affiche si on le lance de la façon suivante :
h 1s -a
. .bashrc H&K .ssh .bash_history .emacs.d Prog&ra&nmation

Admin Chansons LaTeX


Affiche.jpeg debian.html .lesshst
article.pdf = doc.tar.gz mail
Les fichiers commençant par . sont souvent des fichiers de configuration
% 1s -a Admin . et … sont deux répertoires
Comptes.xm]1 Impots particuliers, voir page 23.
-a (pour all, tout) est une OPTION qui modifie le comportement de 1s sans
en changer l’objet : afficher le contenu du répertoire courant ou des répertoires
passés en argument. Les options se différencient des arguments par le fait
qu’elles commencent systématiquement par un ou deux tirets (-).
Récapitulons : arguments et options
Les commandes acceptent généralement un ou plusieurs arguments, sépa­
rés par des espaces :
P P Affiche le contenu des dossiers
% 1s Admin LaTeX Admin et Latex
Elles peuvent aussi accepter des options qui modifient leur comportement.
Ces dernières commencent par un ou deux tirets.
20 CHAPITRE 2 — KIT DE SURVIE
Caractères spéciaux
Les caractères suivants ont une signification particulière pour le shell ;
| on les nomme « CARACTÈRES SPÉCIAUX ». Pour les utiliser tels quels dans une
| ligne de commande, il faut les précéder du caractère d’échappement, « \ » ;
Ÿ on dit alors qu’on les ÉCHAPPE :
Caractères spéciaux, qu’il faut échapper
x 78<> ‘-?""{} [] ; \ # ! $ | etespace
. Oublier d’échapper l’un de ces caractères donne des réponses pour le
} moins inattendues, comme dans l’exemple suivant :
% 1s H\&K Commande correcte
chapitre_1.tex chapitre_2.tex chapitre_3.tex
% 1s H&K En oubliant d’échapper « & », qui lance des
[1] 16555 commandes en tâche de fond (voir page 93)
bash: K: command not found
1s: ne peut accéder H: Aucun fichier ou
répertoire de ce type
Beaucoup d’erreurs de débutants proviennent de caractères spéciaux
non échappés. Si un message d’erreur vous semble obscur, cherchez de ce
y côté en premier.

b. Et pourquoi pas list ?


Nous avons vu plus haut que 1s est l’abréviation de list. Peut-on pour au­
tant utiliser 1ist à la place de 1s ? Essayons :
% list
bash: list: command not found … Commande non trouvée
Le shell nous informe courtoisement qu’il n’a pas été en mesure de trouver
la commande nommée list. En effet, 1s ne s’utilise que sous ce nom. Il y a
fort à parier que vous croiserez ce message bon nombre de fois. La plupart
du temps, il est dû à une faute de frappe dans le nom d’une commande. Néan­
moins, il peut aussi signifier que le programme que vous souhaitez utiliser
n’est pas installé*. Reportez-vous alors à l’annexe page 162 pour des instruc­
tions d’installation.
Les langues de la ligne de commande
| Suivant les cas, le shell peut vous parler en anglais ou en français. Ceci
reflète le fait que les logiciels de la ligne de commande sont écrits en an­
glais et qu’ils ne sont pas toujours complètement traduits. Nous avons pris
le parti de montrer exactement ce que donne le shell dans un environne­
ment français ; au besoin, la version anglaise sera donnée en note.

4. Ou bien que son répertoire d’installation n’est pas dans le $PATH, voir page 101 pour y
remédier.
a. Le système de fichiers°
Sur une machine de type Unix, les
fichiers sont organisés hiérarchiquement n/
-S home
sous forme d’un arbre. Tous les fichiers et
répertoires sont issus de la « RACINE » (root |:Ù vf
en anglais) symbolisée par une unique ë .bashrc
barre oblique « / ». Contrairement à Win­ 9 Admin
dows, il n’y a pas de notion de lecteur Comptes.xml
(C:, D: etc.): les fichiers sont tous pla­ 0 Impots
cés dans une arborescence unique, même Affiche.jpeg
s’ils appartiennent à des disques différents,
*"* Ôbw a représercté les
voire à des ordinateurs différents dans le
rpusr
0 bi4ichiers par le
cas de fichiers partagés. Ces distinctions
sont gérées de manière transparente par > pictogramme & et les
le système d’exploitation. Ainsi, les fichiers répertoires par .
décrits plus hauts pourraient s’organiser Arborescence des fichiers
comme montré ci-contre.

il peut en effet exister un autre fichier nommé Affiche. jpeg quelque part
ailleurs dans la hiérarchie. On utilise pour le désigner son CHEMIN ABSOLU,
ou chemin complet (respectivement absolute path et full path anglais)® :
/home/vf/Affiche.jpeg
C’est le chemin que l’on parcourt depuis la racine pour arriver au fichier,
en séparant chaque élément par des barres obliques /. Ainsi, pour éviter les
ambiguïtés, il n’est donc pas possible d’inclure une barre oblique dans le nom
d’un fichier ou d’un répertoire.
À vous de jouer

Caractères autorisés dans les noms de fichiers


Les caractères que l’on peut utiliser dans un nom de fichier se répar­
tissent dans les catégories suivantes :
— sans problèmes : les caractères sans accents, les chiffres, le caractère
souligné « _ », le point « . », le signe plus « + » et le tiret « - » s’il n’est
pas en début du nom ;

5. Filesystem, en anglais.
6. « vf », est mon login, nous y reviendrons page 23.
22 CHAPITRE 2 — KIT DE SURVIE
- délicats : les caractères accentués ;
— problématiques : les autres, en particulier les caractères spéciaux (voir
encadré page 20), dont les espaces, et « - » en début de fichier ;
— interdit : la barre oblique /.
Les caractères accentués posent rarement des problèmes si les fichiers
| concernés ne sont pas échangés avec d’autres ordinateurs. En revanche,
| il est préférable de les éviter pour des fichiers partagés”.
Il est parfaitement possible d’utiliser des espaces et autres caractères
spéciaux, à condition de ne pas oublier de les échapper. C’est cependant peu
recommandable pour les débutants, car les messages d’erreur pour un carac­
tère spécial non échappé sont souvent incompréhensibles. Pour cette raison,
| cantonnez-vous dans un premier temps aux deux premières catégories®.

b. Le répertoire courant
Pour simplifier l’accès aux fichiers, le système d’exploitation définit un RÉ­
PERTOIRE COURANT : C’est celui « dans lequel on est ». Les fichiers ou réper­
toires de ce répertoire peuvent être désignés par leur nom. Si le répertoire
courant est /home/vf, /home/vf/Admin peut s’abréger en Admin. De même,
depuis ce répertoire, on peut désigner /home/vf/Admin/Comptes.xm] par
seulement Admin/Comptes.xm1. On parle dans ce cas de CHEMIN RELATIF (re­
lative path), par rapport au répertoire courant : le chemin relatif dépend du
répertoire dans lequel on se trouve.
Chemins relatifs et absolus
Un chemin est absolu s’il commence par / : il est repéré à partir de la racine,
comme /home/vf/Admin. Il est relatif dans le cas contraire ; il est alors
repéré par rapport au répertoire courant.

pwd: connaître le répertoire courant


La commande pwd (pour print working directory, « afficher le répertoire
courant »), renvoie le nom du répertoire courant :
% pwd
/home/vf
Le répertoire dans lequel vous vous trouvez au début d’une session shell
s’appelle le répertoire HOME”. C’est le répertoire dans lequel vous stockez vos
fichiers ; c’est aussi essentiellement le seul répertoire dans lequel vous avez
7. Voir la discussion sur les jeux de caractères page 102.
8. Cette recommandation vaut aussi pour les fichiers que vous créez via des interfaces gra­
phiques, car vous serez peut-être amenés à les manipuler en ligne de commande.
9. Qui veut dire « maison », en français. Cependant, l’anglais est moins choquant ici, et c’est
donc le terme homne qui sera utilisé.
2.3 — NAVIGUER DANS L’ARBORESCENCE 23

le droit d’écrire!°. Il est généralement de la forme /home/v£f!!, où vf (mes ini­


tiales) est le nom d’utilisateur, qu’on appelle le LOGIN.

cd : changer le répertoire courant


On parcourt la hiérarchie des répertoires grâce à la commande cd (pour
change directory, « changer de répertoire »), qui permet de changer de réper­
toire courant. Elle prend comme unique argument le chemin du nouveau ré­
pertoire, relatif ou absolu. Ainsi, en partant de /home/vf, on a deux manières
de se rendre à /home/vf/Admin :
% cd Admin
% cd /home/vf/Admin
À vous de jouer
Comment vérifier que l’on est bien arrivé au bon endroit ?
“pad 1uesg[p
12
cd affiche un message d’erreur‘“ si on lui demande d’aller dans un fichier,
ou dans rien de connu :
% cd Affiche.jpeg
bash: cd: Affiche.jpeg: N’est pas un répertoire
% cd rien
bash: cd: rien: Aucun fichier ou répertoire de ce type
Il est facile de reconnaître les répertoires dans la sortie de 1s, car ceux-ci
sont généralement affichés en bleu gras!*. Si ce n’est pas le cas, on peut s’aider
de l’option -F de 1s pour faciliter la distinction entre fichiers et répertoires :
% 1s -F Admin
Comptes.xm1 Impots/
Les noms des répertoires sont suivis d’une barre oblique, pour rappeler
qu’ils peuvent faire partie d’un chemin plus long.
Quelques raccourcis
On dispose de plusieurs raccourcis pour les chemins couramment utilisés :
Raccourcis
le répertoire parent Pour vemonter d’un niveau
- votre répertoire home
-vf e répertoire home de l’utilisateur v£
le répertoire courant — Surtout utile avec ww et cp, p. 31
- le répertoire que l’on vient de quitter
10. Voir page 48 pour plus d’informations sur les autorisations.
11. Sous Mac OS X, ce serait /Users/vf.
12. Sur une machine ne parlant qu’anglais : « Affiche.jpeg : Not a directory » et « rien : No such
file or directory ».
13. Voir la discussion sur les couleurs page 107.
24 CHAPITRE 2 — KIT DE SURVIE
Le répertoire parent est celui situé juste au-dessus dans la hiérarchie. Ainsi,
pour /home/vf, il s’agit de /home.
À l’exception de -!*, ces raccourcis peuvent s’intégrer dans un chemin plus
long : ainsi, pour passer de /home/vf/Admin à /home/vf/Chansons, l’utilisa­
teur vf dispose des trois possibilités suivantes :
4 cà ../Chansons Remonter à /Mome/vf puis descendre dans
kansons
% cd -/Chansons
% cd -vf/Chansons = et vvf signifient exactement /home/vf
Par ailleurs, puisque le répertoire home est celui dont on se sert le plus
souvent, il bénéficie d’un traitement particulier : c’est là que cd vous emmène
s’il est appelé sans argument. En conséquence, l’utilisateur vf dispose d’une
quatrième méthode pour se rendre à /home/vf/Chansons, en enchaînant les
deux commandes suivantes :
% cd Aller à /kome/vf
% cd Chansons =— Puis, descendre dans Chansons

c. Les attributs des fichiers


Si on le lui demande au moyen de l’option -1 (pour « long »), 1s fournit
des informations détaillées sur les fichiers :
% 1s -1
total 1231 — espace total occupé par les fichiers affichés
drwxr-xr-x 3 vf vf 4096 sep 3 2011 Admin
-rw-r--r-- 1 vf vf 323879 jan 4 2011 Affiche.jpeg
-rw-r--r-- 1 vf vf 334342 dec 11 22:27 article.pdf
drwxr-xr-x 2 vf vf 4096 oct 5 2010 Chansons
-rw-r--r-- 1 vf vf 46888 aoû 7 2011 debian.html
[….]

Sur la première ligne, 1s donne la taille totale (en kilo-octets) occupée par
les fichiers qu’il énumère, ici 1231!*. Puis viennent les fichiers et les réper­
toires, organisés en lignes de la forme :
-rw-r--r-- Î v£f vf 323879 jan 4 2011 Affiche.jpeg
— La succession pour le moins étrange de lettres -rw-r--r-- représente
les AUTORISATIONS du fichier : le système d’exploitation se base sur ces
informations pour vous accorder ou non l’accès à un fichier ou à un
répertoire. Nous y reviendrons page 48.
- Le nombre suivant (ici 1) n’est utile que pour les administrateurs des
machines où la sécurité est importante.
14. Si on ne peut pas intégrer - dans un chemin, on peut par contre l’utiliser plusieurs fois
pour revenir aux répertoires antérieurs : ainsi, cd -- remonte à l’avant-dernier répertoire visité.
15. Cette taille ne tient pas compte des fichiers présents dans les sous-répertoires du répertoire
affiché, voir la commande du page 53 pour faire cela.
2.3 — NAVIGUER DANS L’ARBORESCENCE 25

— Les noms suivants vf vf désignent respectivement l’utilisateur et le


groupe auxquels le fichier appartient. Nous les décrirons en même temps
que les autorisations.
— Ensuite vient la taille du fichier en octets, ici 323879.

— jan 4 2011 est la date de la dernière modification du fichier, ici le 4 jan­


vier 2011!$,

— Enfin vient Affiche. jpeg, le nom du fichier lui-même.

Les attributs d'un fichier

S sT S v v
autorisations propriétaires — taille — date de modification = nom du fichier

Comme précédemment, pour obtenir les attributs de fichiers bien précis,


et non de tout le répertoire courant, il suffit de les passer en arguments :

% 1s -1 Affiche. jpeg
-rw-r--r-- 1 vf vf 323879 jan 4 2011 Affiche.jpeg
Ceci ne fonctionne pas pour connaître les attributs d’un répertoire, car 1s
préfère afficher son contenu, comme en l’absence de l’option -1. On peut éviter
cela à l’aide de l’option -d (pour « ne pas descendre dans les répertoires ») :
% 1s -1 -d Admin
drwxr-xr-x 3 vf vf 4096 sep 3 2011 Admin
Groupage des options
On peut grouper plusieurs options d’une commande après un unique tiret.
Cette possibilité porte le nom de bundling, « groupage » en français, et s’ap­
plique tant à 1s qu’à la plupart des autres commandes :

% 1s -1h Affiche.jpeg
-rw-r--r-- 1 v£f vf 317K jan 4 2011 Affiche.jpeg

16. Attention : le format des dates varie grandement d’une configuration à une autre. Dans
certains cas, la date s’écrit 2011-04-01, avec le jour intercalé entre l’année et le mois. En cas
de doute, cherchez une colonne avec des nombres supérieurs à 12.
26 CHAPITRE 2 — KIT DE SURVIE
d. Visualiser l’arborescence : tree
Le programme tree permet de visualiser rapidement une arborescence
de fichiers!”, Comme son nom l’indique (tree signifie « arbre »), il dessine un
arbre représentant le répertoire courant (ou ceux passés en arguments), ses
fichiers, ses sous-répertoires, leurs fichiers, etc.
% tree Admin
Admin
|-- Comptes.xm1l
‘-- Impots
|-- 2009
| |-- Declaration.pdf
| ‘-- Taxe-Habitation.pdf
‘-- 2010
‘-- Declaration.pdf

3 directories, 4 files — 3 répertoires, 4 fichiers


L'arborescence est représentée aussi fidèlement que possible dans un ter­
minal. tree conclut sa sortie en dénombrant les fichiers (files, ici 4) et réper­
toires (directories, 3) qu’il a affichés. tree accepte de nombreuses options pour
contrôler les informations données ; en voici quelques-unes :
Options principales de tree
-a affiche aussi les fichiers cachés
-s affiche la taille
-h taille en k, M, G (utile uniquement avec -s)
-d _ affiche seulement les répertoires
-A trace de vraies lignes!®au lieu de -, ‘ et |

2.4 Lire un fichier


Passons maintenant à vos fichiers, et à deux utilitaires permettant l’un
de déterminer le type d’un fichier, et l’autre de lire une grande catégorie de
fichiers que l’on appelle les « fichiers texte ».

a. Types et extensions
Les fichiers de votre ordinateur peuvent stocker de nombreux types d’in­
formations, comme des images, des vidéos, de la musique, des documents,
des programmes, des données bancaires… Chacun de ces types peut être enre­
gistré dans différents formats : on peut citer les formats JPEG et PNG pour les
17. Ce programme n’est pas installé par défaut ; voir l’annexe « Installations de programmes »
page 162 y remédier.
18. Cette option n’est pas activée par défaut parce qu’elle peut donner des résultats inattendus
sur certains terminaux ; on verra page 97 comment l’activer de manière systématique.
2.4 — LIRE UN FICHIER 27
images, les formats MP3 et WAV pour la musique, etc, Pour s’y retrouver, on as­
socie à chaque fichier une extension qui reflète son format, et donc son type.
Ainsi, les fichiers PNG et JPEG sont pourvus respectivement d’une extension
.png et . jpg ou . jpeg.
Du point de vue le plus strict, rien n’oblige à utiliser des extensions corres­
pondant au format d’un fichier : les informations sont effectivement contenues
dans le fichier, et pas dans son nom. Cependant, bon nombre de programmes,
ainsi que les personnes avec qui vous communiquez, comptent sur des exten­
sions appropriées ; il est donc fortement recommandé d’y faire attention.
Notons qu’il est possible d’empiler plusieurs extensions : par exemple, un fi­
chier PDF (extension .pdf) compressé par gzip (extension .gz, voir page 59)
aura ainsi une extension .pdf .gz"°.

b. Trouver le type d'un fichier : file


Il peut arriver qu’une extension soit ambiguë, inconnue, voire absente.
En outre, il peut être nécessaire de s’assurer du véritable type d’un fichier
avant de l’utiliser, surtout s’il provient de sources peu fiables”’. Le programme
file a été conçu, entre autres, pour cela. Il lit le début des fichiers passés
en argument et y cherche des « signatures », c’est-à-dire des séquences d’octets
caractéristiques d’un format, afin de rendre son verdict :
% file Affiche. jpeg
Affiche.jpeg: JPEG image data, JFIF standard 1.01,
comment: " Image generated by ESP Ghostsc"
Données d'image SJPEG, standard JFIF [.OI, commentaire : & image
générée par ESP Ghostse »
Les informations données par file vont souvent au-delà du format du fichier.
Par ailleurs, file peut aussi analyser les données originelles de certains fi­
chiers compressés, si on le lui demande via l’option -z. Comparez :
% file doc.pdf.gz
doc.pdf.gz: gzip compressed data, was "doc.pdf", from
Unix, last modified: Tue Jan 11 00:11:53 2011
Fichier compressé par gzip, inttialement nommé doc.pdf, issu d’Unix,
modifié pour la dernière fois le…
% file -z doc.pdf.gz
doc.pdf.gz: PDF document, version 1.4
(gzip compressed data, was "doc.pdf", from Unix,
last modified: Tue Jan 11 00:11:53 2011)
Le fichier compressé est effectivement un document PDF.

19. L'extension doit toujours se terminer par le morceau qui correspond à son format réel.
Un fichier . pdf .gz se termine par .gz parce que c’est avant tout un fichier compressé : il faut
d’abord le décompresser avant de pouvoir se servir des données PDE
20. Cet outil ne dispense pas pour autant d’être prudent !
28 CHAPITRE 2 — KIT DE SURVIE
Cette option peut être utilisée sans modération puisqu’elle n’a aucun effet sur
les fichiers non compressés.
file est un allié particulièrement puissant pour faire le tri parmi des fi­
chiers provenant de récupération de données, ou simplement pour explorer
les fichiers installés sur votre machine.

c. Deux grandes familles de fichiers : « texte » et « binaire »


Les fichiers peuvent être classés en deux grandes catégories : les FICHIERS
TEXTE, et les autres, que l’on nomme FICHIERS BINAIRES. Les fichiers texte sont
lisibles sans aide particulière de la machine, comme celui-ci :
debian.html:
<html xmlns="http://www.w3.org/1999/xhtml">
<head profile="http://gmpg.org/xfn/11">
- <meta http-equiv="Content-Type" Page Web au format {FTVAL
content="text/html; charset=UTF-8" />
Même si le contenu exact de ce fichier peut vous échapper, il est clair qu’il est
lisible par un humain, pour peu qu’il connaisse le langage dans lequel il est
écrit (ici HTML). Un fichier binaire, en revanche, ressemble plutôt à ceci :
Affiche.jpeg:
ÿüÿà-@"PJFIF"@"A"A"ATC*T@CT@T@ÿp”@6 Image generated
by ESP Ghostscript (device=pnmraw)
ÿÜT@CTCTATATATATATATATATATATATATATATATATATATATATATA
TATATATATATATATATATATATATATATATATATATATATATATATATA

Même si l’on peut reconnaître quelques mots perdus“!, la plus grande part
du contenu n’est qu’une suite de symboles incompréhensibles.
Binaire ou texte, pourquoi ?
Il ne faut pas confondre la notion de fichier texte (par opposition à bi­
naire) avec celle de document représentant un texte, comme par exemple
un fichier Word. Ce sont deux notions complètement distinctes : un fichier
Word, bien qu’il représente un document textuel, est enregistré dans un for­
mat binaire. Par ailleurs, des fichiers texte peuvent être utilisés pour stocker
des données non textuelles, comme des images ou des programmes.
Pour stocker des données, les auteurs d’un programme ont presque tou­
jours la possibilité de choisir entre un format texte (par exemple XML) et un
format binaire. Ce dernier est généralement plus compact, et il est lu plus
efficacement par l’ordinateur, car les données binaires sont proches de la
forme sous laquelle elles sont manipulées dans la machine. En outre, il est
incompréhensible par un humain°*, ce qui est certainement un avantage
pour les entreprises qui souhaitent protéger le format de leurs fichiers.
21. On peut extraire ces mots au moyen de strings (voir page 54).
22. Décoder un format binaire peut prendre plusieurs mois à un spécialiste dans les cas diffi­
ciles ; le processus se nomme reverse engineering.
2.4 — LIRE UN FICHIER 29

d. less: un lecteur de fichiers texte


Il n’existe malheureusement pas d’utilitaire en ligne de commande per­
mettant de lire tous les types de fichiers. Au mieux, on peut disposer dans
certains cas d’une commande qui redirige automatiquement la demande vers
un programme adapté**. S’il n’existe pas d’outil universel, il existe cependant
un programme, less“°, qui permet d’en lire une portion importante : les fi­
‘chiers texte. Il s’invoque simplement en ligne de commande en lui passant en
argument le nom du fichier que l’on souhaite lire :
% less debian.html

Navigation
Une fois que less est lancé, on peut naviguer dans le fichier au moyen
de raccourcis clavier intuitifs dont voici les principaux :

Touche Action | Touche Action


?Ê 1 ligne vers le haut | u 1 demi-page vers le haut
_ç$; {ou m 1 ligne vers le bas | d 1 demi-page vers le bas
Îfi ou b 1 page vers le haut | gou< début du fichier
q_»ÎÎËquitter
Ou Espæi 1 page verslebas | Gou> fin du fichier
12g aller à la ligne 12
Si une commande est en cours (comme une recherche, voir ci-dessous),
il faut d’abord appuyer sur cn ËG avant d’utiliser l’un de ces raccourcis.
less et les fichiers binaires
Si 1ess estime travailler sur un fichier binaire, il vous le fait savoir :
h less Affiche. jpeg
"Affiche.jpeg' may be a binary file. See it anyway?
Affiche.jpeg est peurt-être un fichier binaire. Soukaitez-vous le voir
quand même ?

23. Voir encadré page 15.


24. Par exemple, les outils tels que see et edit sous Debian, l’utilitaire gnome-open du projet
GNOME, la commande open de Mac OS X.
25. C’est le descendant de more ; ce dernier est obsolète.
30 CHAPITRE 2 — KIT DE SURVIE
Si vous pensez que 1ess se trompe, ou bien si vous souhaitez voir le fi­
chier malgré tout, appuyez sur y (pour yes). Vous avez eu un aperçu de ce
qui vous attend avec le fichier Affiche . jpeg page 28°6,

less est doté d’une fonction étendue de recherche de texte, que l’on active
par le caractère /. Il suffit ensuite de taper le texte à rechercher et d’appuyer
| pour lancer la recherche. On peut alors naviguer entre les occur­
rences avec les touches n (suivante) et N (précédente).

Touches Action
recherche texte
si texte contient () EJ { }7 $. | \+ou *
affiche l’occurrence suivante
N affiche l’occurrence précédente””
Si le texte à rechercher contient au moins un caractère parmi (, ), L
1, {, }, 7, $, ., I, \, + ou *, il faut faire suivre immédiatement le / initial
par c«3 R; la dern1ere ligne se mue alors en Regex-off /. En effet, ces ca­
ractères permettent d’accéder à des fonctions plus avancées’de recherche, et
sont interprétés par 1ess. Si vous oubliez ÎÇ?} R, 1ess vous le signalera par
un « Invalid pattern» (motif invalide), ou, ce qui peut être pire, faussera
complètement les résultats de la recherche sans avertissement”S.
Un petit éditeur de texte: nano
nano%®est le pendant de 1ess pour éditer les fichiers texte. On le lance
de la manière suivante pour travailler sur fichier.txt:
% nano fichier.txt
On s’y déplace avec les touches fléchées ; on en sort avec :cui X et on

26. Notons que dans certaines distributions comme Debian et Ubuntu, 1ess reconnaît certains
types de fichiers binaires et affiche des informations sur ces fichiers plutôt que leur contenu.
L’option -L permet de désactiver cette fonction.
27. Lancer la recherche avec « ? » au lieu de « / » permute les effets de «n » et « N »,
28. C’est le prix à payer pour disposer de fonctions de recherche puissantes, par exemple
« “mot » pour trouver les lignes commençant par mot. Nous y reviendrons page 130.
29. nano est le descendant de pico, qui n’est plus maintenu.
30. nano est doté de nombreuses autres fonctionnalités ; un bon point de départ pour aller
plus loin est son aide en ligne, accessible avec .cs} G.
2.5 — CRÉER RENOMMER, COPIER ET EFFACER 31

2.5 Créer, renommer, copier et effacer


Maintenant que l’on peut regarder le contenu des fichiers et des réper­
toires, il est temps de mettre la main à la pâte et d’apprendre à modifier
le contenu de votre disque.
Attention !

Pq
! Toutes les modifications effectuées en ligne de commande sont immédiates.
| Il n’y a pas de moyen de revenir en arrière : pas de fonction « annuler », pas
, de sauvegardes antérieures…
Assurez-vous d’avoir correctement tapé une commande qui
modifie le disque avant d’appuyer sur Eñt

a. Créer
Des fichiers
Pour éviter de causer trop de dégâts en manipulant vos fichiers, nous allons
d’abord apprendre à créer des fichiers vides (de taille 0). La commande
% touch vide
crée vide, un fichier sans contenu. Si vide existe déjà, son contenu n’est pas
modifié, mais sa date de dernière modification est mise à jour.
Des répertoires
On crée un répertoire (vide) avec la commande mkdir (pour make direc­
tory, « créer un répertoire »), par exemple :
% mkdir temp
qui créée un répertoire temp dans le répertoire courant. Si temp existe déjà,
qu’il soit un répertoire ou un fichier, mkdir vous le signale et échoue.
Par défaut, mkdir ne crée que la dernière partie du chemin donné :
% mkdir Un/Long/Chemin
ne fonctionne que si Un/Long est déjà un répertoire. On peut cependant passer
outre cette limitation avec l’option -p (pour créer aussi les parents) :
% mkdir -p Un/Long/Chemin n
crée le répertoire Un/Long/Chemin en créant Un et Un/Long si nécessaire*!.
Mise en place d’un « bac à sable »

31. Cette commande échoue cependant si Un ou Un/Long existe mais n’est pas un répertoire.
32 CHAPITRE 2 — KIT DE SURVIE
b. Renommer et déplacer
La commande mv (move, « déplacer ») sert à déplacer ou à renommer des
fichiers et des répertoires. Elle prend deux arguments, la source et la cible,
et se comporte différemment suivant la nature de la cible. Si cette dernière est
un répertoire, la source est déplacée dans ce répertoire. Dans le cas contraire,
elle est renommée :
% mv Affiche.jpeg These
These est un répertoire : déplace Affiche.jpeg dans These
k nmv Affiche.jpeg Image.jpeg
\mage.jpeg n’est pas un répertoire : renomme Affiche.jjpeg en lmage.jpeg
mv fonctionne indifféremment sur les fichiers et les répertoires.
Si le fichier cible existe déjà, mv l’écrase sans autre forme de procès, sauf
si l’on a donné l’option —i (pour interactive, « interactif ») :
% mv -i source cible
mv: écraser ‘cible’ 7
nv attend alors une réponse de votre part :
— pour annuler la commande et conserver le fichier cible, appuyez sur
n (pour non) puis
— pour l’écraser, appuyez sur y°*(pour yes) avant :Enrée
On peut déplacer plusieurs fichiers et/ou répertoires en une seule fois :
k mv Affiche.jpeg Presentation.pdf These
Ceci ne fonctionne que si le dernier argument (la cible) est bien un répertoire.
mv ne peut pas renommer plusieurs fichiers d’un coup**.
À vous de jouer
Comment remettre Presentation. pdf dans le répertoire courant après la
commande précédente ?
* Jpd‘uorIequesezg/esoqz au

c. Copier
Des fichiers
Copier des fichiers, c’est comme les déplacer, si ce n’est que l’on ne sup­
prime pas le fichier original. C’est pourquoi la commande pour copier les fi­
chiers, cp (copy, « copier »), s’utilise de la même manière que nv :
% cp Affiche.jpeg Soutenance. jpeg
Copie Affiche.jpeg en Soutenance.jpeg
32. En anglais, ce serait mv : overwrite ‘cible? ?
33. y fonctionne systématiquement. Dans un environnement français, on peut aussi utiliser o
pour « oui».
34. Par contre, rename le peut, voir page 133.
2.5 — CRÉER RENOMMER, COPIER EF EFFACER 33

% cp Affiche.jpeg These
Copie Affiche.jpeg dans le répertoire These
% cp Affiche.jpeg Presentation.pdf These
Copie Affiche.jpeg et Presentation.pdf dans le répertoire These
cp est aussi doté d’une option -i ayant le même effet que pour mv.
J cp et les attributs des fichiers
Par défaut, cp ne préserve ni la date de modification, ni les permissions, ni
{ les utilisateurs et groupes propriétaires du fichier. L’option -p demande à
| cp de les respecter dans la mesure du possible.

Des répertoires
cp refuse de travailler sur un répertoire, à moins qu’on le lui demande
explicitement à l’aide de l’option -R (pour récursif*°). Il copie alors l’intégralité
du répertoire et de tous ses sous-répertoires :
% cp Admin tenp
cp: omission du répertoire ‘Admin?36
Le répertoire Admin n’a pas été copié
% cp -R Admin temp
Admin et-tous ses sous-répertoires sont copiés dans tewp
Notons que l’option -R n’a aucun effet sur les fichièrs normaux, qui sont
copiés comme d’habitude.
-a pour « archive »
y Muni de l’option -a, cp copie tous les arguments, fichiers et répertoires,
comme s’il devait en faire une archive : il copie tous les sous-répertoires et
préserve le maximum d’attributs possibles*”.

d. Effacer
Des fichiers
On efface des fichiers avec la commande rm (pour remove, enlever). Elle
prend en argument les noms des fichiers à supprimer :
% rm fichier Supprime « fichier »
Comme nv et cp, rm accepte une option —i qui lui fait demander confirma­
tion pour tout fichier qu’il efface*S.
35. On pourra retenir -R pour répertoire.
36. Ou bien eri anglais: cp : omitting directory ‘Admin’.
37. Cette option n’est pas toujours présente, en particulier sous certaines versions de Mac OS X.
Utilisez alors -dpR pour obtenir le même effet.
38. Dans certaines distributions, cette option est activée par défaut par le biais d’un alias (voir
page 95). Il faut alors utiliser l’option -£ pour désactiver les confirmations, ou bien supprimer
l’alias au moyen de unalias.
34 CHAPITRE 2 — KIT DE SURVIE
Attention : on ne peut pas récupérer un fichier effacé !

39 y

Astuce : les fichiers commençant par « - »


Il arrive de créer par accident un fichier commençant par un « -— », par
exemple -fichier. Pour le supprimer, lancer
% rm -fichier
ne fonctionne pas*. Pour éviter ceci, il suffit de le faire précéder de . / :
h rm ./-fichier rm s’intévesse bien au fichier & -fichier »
Par ailleurs, pour beaucoup de programmes, l’option spéciale -- force
tout ce qui suit à être interprété en tant qu’arguments. On peut donc de ma­
nière équivalente utiliser :
% rm -- -fichier

Des répertoires
Tout comme cp, rm n’accepte de travailler sur un répertoire que si on lui
passe l’option —R :

% rm -R repertoire Supprime tous les fichiers et sous-Fépertoires


Alternativement, on peut utiliser rmdir, qui ne supprime les répertoires
passés en arguments que s’ils sont vides. Si vous pensez que c’est le cas, pour
plus de sûreté, préférez rmdir à rm -R:
% rmdir repertoire Échoue si le repertoire n’est pas vide
rm -R et la prudence
Personne n’est à l’abri d’une erreur d’inattention, c’est pourquoi il faut
être particulièrement vigilant au moment de lancer une commande rm -R.
Lancez tree sur le répertoire à supprimer, et utilisez -i ou rmdir en cas
de doutes.
J’ai eu le malheur de créer par accident un répertoire - dans un réper­
toire de travail et d’essayer de m’en débarrasser en lançant** :
% rm —R - Ne pas lancer cette commande !

39. Nous apprendrons plusieurs manières d’effectuer des sauvegardes page 59.
40. En effet, cette commande lance rm sans argument, avec les options f, i, c, h, e et r, voir
l’encadré sur le groupage page 25.
41. Une manière de faire aurait été rm -R \- pour éviter que le shell n’interprète -.
2.5 — CRÉER, RENOMMER, COPIER ET EFFACER 35

| Ceci a entraîné la destruction d’une partie importante de mon répertoire


home avant que je comprenne ce qu’il se passait et que j'interrompe la com­

Récapitulons
Créer
touch fichier fichiers (vides)
mkdir repertoire répertoires (vides)
mkdir -p Un/Long/Chemin crée Un et Un/Long si nécessaire
Renommer, déplacer
nv source cible fichiers, répertoires
nv -i source cible pour confirmer avant de remplacer
Copier
cp source cible fichiers
cp -R source cible répertoires (et leurs fichiers)
cp -a source cible tout le plus fidèlement possible
cp -i source cible pour confirmer avant de remplacer
Supprimer
rm fichier1 fichier2 fichiers
rmdir repertoire répertoires vides
rm -R repertoire répertoires non vides
rm -i fichier pour confirmer avant d’effacer

Nous avons vu comment copier, déplacer et supprimer des fichiers, mais,


jusqu’à présent, rien qui ne soit pas faisable aussi rapidement avec un gestion­
naire de fichiers graphique. Nous allons maintenant remédier à ceci et aborder
l’un des principaux avantages de la ligne de commande : comment agir sur
de nombreux fichiers d’un seul coup. La pierre angulaire de ces possibilités est
le JOKER (wildcard en anglais) « * », qui permet de remplacer n’importe quelle
suite de caractères dans un nom. Voici quelques exemples :

42. Nous verrons plusieurs manières d’interrompre des commandes page 92.
36 CHAPITRE 2 — KIT DE SURVIE

Utilisations du joker *
1s *.jpeg affiche tous les fichiers/répertoires se termi­
nant par . jpeg dans le répertoire courant
cp A* temp copie tous les fichiers** du répertoire courant
commençant par À dans le répertoire temp
rm *old* A*.jpeg supprime tous les fichiers contenant old et
tous ceux commençant par À et finissant par
.jpeg“”
1s -d .* n’affiche que les fichiers/répertoires « cachés »
1s -d .* * affiche tous les fichiers/répertoires du réper­
toire courant, y compris les fichiers cachés
1s -1 Et\xile affiche les détails du fichier « Et+ile »

Pour utiliser tel quel le caractère « * », il faut l’échapper avec « \ »*°, Si aucun
fichier-ne correspond au motif donné, vous obtenez une erreur :
% 18 -1 1ksjdf*
1s: lksjdf*: Aucun fichier ou répertoire de ce type46
Notons que le joker * honore la convention des fichiers cachés et ne permet
de les remplacer que si le motif commence explicitement Wpa_1: un point ; dans
ce cas, il ne donne que les fichiers cachés correspondants. De plus, il ne permet
pas de remplacer une barre oblique /. En d’autres termes, il ne descend pas
dans les sous-répertoires. Toutefois, on peut le forcer à le faire en spécifiant
explicitant le caractère « / ». Ainsi,
% 1s -1 */*.pdf
trouve doc/rapport .pdf, mais en revanche n’affiche ni document.pdf, ni
doc/mars/bilan.pdf‘”. De manière similaire, la commande suivante affiche
tous les sous-répertoires du répertoire courant :
% 1s -1d */
Quelles commandes comprennent * ?
Les cLoBs (motifs basés sur>* et d’autres jokers que nous verrons
page 126) sont interprétés par le shell, qui les remplace par la liste des fi­
chiers correspondants avant de lancer la commande. La commande ne voit
donc jamais le glob, seulement son remplacement. Ainsi, dans le répertoire
Admin/Impots introduit page 26, la commande

43. Devinette : pourquoi ne copie-t-elle pas les répertoires ?


44, Comme par exemple le fichier Reynolds. jpg, car il contient old.
45. Voir encadré page 20.
46. Ou en anglais: 1s : 1ksjdf* : no such file or directory.
47: Les heureux utilisateurs de zsh pourront utiliser **/*.pdf pour.travailler sur ces trois
‘fichiers en même temps (voir page 161).
2.6 — RECHERCHER UN FICHIER 37
% 1s -1d *
est exactement équivalente à :
% 1s -I1d 2009 2010

2.6 Rechercher un fichier


La ligne de commande offre des possibilités avancées de recherche de fi­
chiers via deux utilitaires complémentaires : 1locate et find.

a. locate: recherche sur tous les fichiers


locate est un outil simple et rapide pour chercher des fichiers. Il suffit
de lui donner une partie de son chemin en argument :
% locate interface
/etc/interfaces Il s’agèt des uctilitaires
/etc/interfaces/if-up.d pour COWçî9Wêr le
/etc/interfaces/if-up.d/ntp-server _ "ÉSeau.
/etc/network/interfaces
% locate Comptes Les majuscules comptert !
/home/vf/Admin/Comptes.xm]l
La recherche est effectuée sur la hiérarchie entière du système de fichiers,
c’est-à-dire sur l’ensemble de votre ordinateur. En conséquence, il faut éviter
de chercher un élément très courant, car 1ocate renvoie alors beaucoup trop
de réponses pout que l’on puisse en tirer quelque chose** :

% locate bin bin désigne les répertoires où soxt rangés les


[18000 lignes] programmes (comme /usr/bin ou </bin)
La portion du chemin recherché peut contenir /, ce qui peut servir à limiter
le nombre de résultats :

48. convert permet de manipuler des images et de les convertir entre différents formats (voir
page 63).
49. On peut utiliser xargs (page 121) ou des boucles for (page 152) pour les faire travailler
sur plusieurs fichiers un par un.
50. À moins que l’on utilise des outils comme grep pour filtrer ces réponses (page 116),
comme locate bin | grep pdf pour trouver les programmes dont le nom contient « pdf ».
38 CHAPITRE 2 — KIT DE SURVIE
% locate magick/index Documentation HTML de
/usr/share/doc/imagemagick/index.htm1 lmageMagick, voir p.63
locate ne travaille pas directement sur le contenu du disque dur, mais
depuis une base de données régénérée périodiquement (en principe chaque
nuit). Ceci rend la recherche très rapide mais, en contrepartie, les résultats
reflètent l’état de vos fichiers au moment de la dernière mise à jour de cette
base de données, pas forcément leur état actuel°!. Pour ces raisons, Locate
est surtout utile pour :
— retrouver des fichiers personnels qui n’ont pas été créés ou déplacés de­
puis la dernière mise à jour de la base de donnée ;
— localiser un fichier « global » (par opposition à fichier personnel) : fichier
de configuration, documentation, différentes versions d’un programme.

b. find: recherche locale


find permet de trouver des fichiers répondant à des critères précis dans
une hiérarchie de fichiers donnée, et pas forcément sur tout le système de fi­
chiers, à la différence de 1ocate. Voici quelques manières de l’utiliser.

find dans le répertoire courant”*


find trouver tous les fichiers dans le réper­
' toire courant et tous ses sôus—répertoires
find -name photo … dont le nom est exactement photo
find -iname photo … dont le nom ne diffère de photo que
par la casse (minuscules/majuscules)
find -name \*.pdf … dont le nom se termine par .pdf
find -name \*pdf\* … dont le nom contient pdf
find dans un autre répertoire
find docs trouver tous les fichiers dans le réper­
toire docs et tous ses sous-répertoires
find docs -name \*pdf\* … dont le nom contient pdf

La signification du joker * est exactement la même qu’avant. Cependant,


il faut absolument penser à l’échapper pour que le shell le transmette à find
sans l’interpréter. Par exemple, dans le répertoire de la page 19, lancer la com­
mande
% find -name *.pdf
51. locate se plaint si la base de données n’a pas été mise à jour récemment : « varning :
database /var/cache/locate/locatedb is more than 10 days old» («la base de don­
nées date de plus de 10 jours »). Pour la mettre à jour, il faut lancer updatedb en tant que super­
utilisateur (voir page 162) ; ceci fait généralement l’objet d’une tâche planifiée (voir page 86).
52. Sous Mac OS X, cette construction ne marche pas. Il faut spécifier explicitement que l’on
travaille dans le répertoire courant, comme dans find . -name photo.
2.7 — LE TRÈS SAINT MANUEL 39
est équivalent à lancer
% find -name article.pdf
puisque le shell interprète *.pdf avant de le passer à find. En conséquence,
au lieu de trouver tous les fichiers PDF, il ne trouve que ceux dont le nom est
article.pdf. Ceci n’arrive pas si l’on utilise \* au lieu de *°°,
find est beaucoup plus sélectif que locate, et il travaille sur le contenu
actuel du disque. Le prix à payer, c’est qu’il est plus lent**. Il faut le réserver
aux petites hiérarchies de fichiers, comme des répertoires personnels. find
peut aussi baser sa recherche sur d’autres critères que le nom (date, taille),
nous y reviendrons page 57.

2.7 Le Très Saint Manuel


La plupart des programmes utilisables en ligne de commande sont dotés
d’une aide en ligne sous la forme d’une PAGE DE MAN (pour « manuel »), qui
peut être consultée avec la commande du même nom. Par exemple,
% man 1s
affiche l’aide en ligne de 1s. Comme man utilise 1ess pour l’affichage (voir
page 29), vous pouvez naviguer dans l’aide exactement de la même manière
que dans un fichier texte — pensez à exploiter les fonctions de recherche !

a. Anatomie d'une ‘page de man


Une page de man s’organise en différentes parties, indiquées en gras ma­
juscules :
— NOM (ou NAME) : le nom et une brève description du programme :
NOM
1s - Afficher Îe contenu de répertoires
— SYNOPSIS : les différentes manières d’utiliser le programme, qui uti­
lisent les conventions suivantes

Conventions usuelles des pages de man


[facultatif] un élément facultatif
… l’élément peut être répété plusieurs fois
{fromage | dessert} un choix entre plusieurs possibilités“°

SYNOPSIS
1s [OPTION]... [FICHIER]...
53. Ou bien si l’on utilise des guillemets simples, « ? *. pdf* », voir page 125.
54. Typiquement 100 fois plus lent sur l’intégralité du disque : pour une recherche sur tout
le disque, préférez 1ocate ! Ce dernier utilise d’ailleurs find pour mettre à jour sa base de
données…
55. Parfois sans les accolades autour.
40 CHAPITRE 2 — KIT DE SURVIE
Ce synopsis signifie que qu’on peut passer ou non à 1s une ou plusieurs
options et préciser ou non un ou plusieurs fichiers en argument. Si le pro­
gramme peut s’utiliser de plusieurs manières différentes, il y a plusieurs
lignes dans le synopsis (voir par exemple man mv).
— DESCRIPTION : une description beaucoup plus poussée du programme.
— OPTIONS : une liste des options que le programme accepte.
— Suivant les programmes, il peut aussi exister d’autres sections contenant
des exemples, la descriptions de fichiers de configuration, des détails sur
les formats des fichiers reconnus, une liste des problèmes connus…
— La plupart des pages de man finissent par le nom des auteurs du pro­
gramme et de la page de man (section AUTEURS ou AUTHORS) et, sur­
tout, donnent des pointeurs vers d’autres pages de man ou d’autres types
de documentation (section VOIR AUSSI ou SEE ALSO).

b. À quoi servent les pages de man ?


Les pages de man ont des contenus et des qualités assez variables, à l’instar
des programmes disponibles sur votre ordinateur : on peut y trouver de vrais
manuels didactiques aussi bien que des descriptions lapidaires assorties d’une
référence vers d’autres documentations plus fournies. Cependant, dans l’en­
semble, une page de man répond aux questions suivantes :

— Que fait le programme ?


— Comment l’utiliser ?

— Où trouver une documentation plus précise si nécessaire ?

C’est pourquoi il est bon d’avoir le réflexe «man commande » à chaque fois
que l’on a une question à propos d’une commande. Un bémol, cependant :
si la plupart des programmes de base (comme mv et cp) ont une page de man
en français, ce n’est malheureusement pas le cas de la majorité des autres”°.
Bon à savoir

Les pages de man ne se bornent pas aux programmes utilisables en ligne


de commande, mais documentent aussi d’autres aspects des systèmes Unix.
Pour faciliter la distinction entre les différentes catégories de documentation,
les pages de man sont organisées en 9 sections :

56. Si vous n’avez pas de difficultés à lire l’anglais, il est préférable de consulter les pages de
man en version anglaise, car elles sont en général mieux écrites, plus à jour et elles contiennent
moins d’erreurs. Nous verrons page 102 comment choisir la langue de la ligne de commande.
2.7 — LE TRÈS SAINT MANUEL 41

Sections des pages de man


1 programmescourants = Comme ls et cp, par exemple.
2 appels système en C°7
3 documentation de bibliothèques de programmation
4 fichiers spéciaux du répertoire /dev, périphériques
5 fichiers de configuration, fichiers système
6 jeux
7 divers : concepts, tutoriels, formats de fichiers…
8 programmes d’administration système
9 (Linux seulement) documentation du noyau

Deux pages de man avec le même nom peuvent exister dans des sections
différentes*S. Par exemple, groff est le programme utilisé par man pour affi­
cher ses pages et les convertir en d’autres formats. La page de man de groff
en section 1 documente l’usage du programme groff, tandis que sa page
de man en section 7 documente le format qu’il comprend. Pour obtenir cette
dernière, il faut invoquer man comme suit :
% man 7 groff
La notation mv(1) désigne par convention la page de man de mv en sec­
tion 1 : la commande précédente affiché donc groff (7).

C. man cd?
% man cd
No manual entry for cd* Pas de page de manuel pour cd
Oups….. Les commandes utilisables en ligne de commande se classent en
deux catégories : les programme extérieurs, comme cp qui est contenu dans
le fichier /bin/cp, et les commandes internes du shell (shell built-in en an­
glais), qui sont prises en charge directement par ce dernier. Pour des raisons
techniques cd en fait partie, c’est pourquoi elle est documentée dans la page
de man du shell, bash(1).
Pour trouver la documentation d’une commande, il est par conséquent né­
cessaire de faire la différence entre un programme et une commande interne.
C’est l’objet de la commande type“® :
% type cd cp rien Que sowt cd, cp et rien ?
cd is a shell builtin Commande interne
cp is /bin/cp Programume externe
57. Le C est le langage de programmation dans lequel les systèmes Unix/Linux sont écrits ;
Cest pour cela qu’il occupe une place privilégiée dans la documentation.
58. Les pages sont cherchées successivement dans les sections 1, 8, 3, 2, 5, 4, 9, 6 et enfin 7,
dans cet ordre ; man affiche la première qu’il trouve.
59. Dans certains systèmes, il est possible qu’il y ait une page de man cd(1), ouù au moins une
redirection vers une page générique décrivant les commandes internes du shell.
60. Pour le shell tcsh (voir page 160), c’est la commande vhich qu’il faut utiliser.
42 CHAPITRE 2 — KIT DE SURVIE
bash: type: rien: not found Pien de connu
Dans le cas d’un programme externe, type donne son chemin complet,
ce qui permet de savoir quelle version on est réellement en train d’exécuter.
À vous de jouer
Que peut bien donner la commande type type ?

2.8 Trois raccourcis indispensables


Nous allons achever notre première approche de la ligne de commande
par trois raccourcis qui permettent de ne pas taper plus de texte qu’il n’est ab­
solument nécessaire : la complétion automatique, l’utilisation de lhistorique,
et bien sûr les possibilités de copier/coller.

a. Tabulation: la complétion automatique


Quand on appuie sur la touche de tabulation (Αä}), le shell complète
le nom du fichier que l’on est en train de taper, pourvu qu’il n’y ait qu’une
seule complétion possible :
% 18 Aff + æ| —> 1s Affiche.jpeg
Si plusieurs fichiers peuvent correspondre, un deuxième appui sur ËË}
donne la liste de toutes les possibilités.
hlsA+W4+4+ w —
Admin/ Admin2/ Affiche.jpeg
Il faut alors taper au moins un caractère pour lever l’ambiguïté, et appuyer
à nouveau sur Ë:Ï}61. S’il y a trop de complétions possibles, le shell vous de­
mande confirmation avant de les afficher :
% 1s /usr/bin/ + J…j + m =—
Display all 2141 possibilities? (y or n)
Afficher les 2141 possibilités ?
Il est alors conseillé d’appuyer sur n (pour no, « non »)..
Ce raccourci permet également de compléter partiellement un nom de fi­
chier. Si vous avez une série de fichiers commençant par UnNomLong, et au­
cun autre commençant par U, un appui sur Q après un U le complétera
en UnNomLong. Ceci est aussi valable pour les chemins incluant des réper­
toires: vous pouvez ainsi taper quelques lettres, appuyer sur Tæi pour com­
pléter le nom d’un répertoire, en taper quelques autres puis enfin appuyer sur
î“î! pour le nom du fichier.
61. Les heureux utilisateurs du shell zsh (voir page 160) peuvent parcourir les différentes
possibilités avec des appuis successifs sur la touche Î:Q
2.8 — TROIS RACCOURCIS INDISPENSABLES 43

La complétion automatique gère correctement les noms de fichiers conte­


nant des caractères spéciaux, notamment les espaces, qu’elle fait automatique­
ment précéder de \ :
% cdH+æ| —> cd H\&K/
De la sorte, vous n’aurez presque jamais à taper de \, même si certains
de vos fichiers contiennent des caractères spéciaux (gardez cependant à l’esprit
que cela n’est pas conseillé, voir encadré page 21).
C’est la complétion automatique qui fait qu’il est confortable de travailler
avec le shell. À utiliser sans modération !
Complétion contextuelle
Suivant le shell que vous utilisez, la complétion automatique peut dé­
pendre du contexte. Le premier mot de la ligne est toujours compris comme
une commande, et complété comme tel :
% mkd + æ —> mkdir
Puis, suivant la commande, certains noms peuvent être sélectionnés plu­
tôt que d’autres: uniquement des fichiers PDF après une commande qui
travaille sur des fichiers PDF par exemple, ou uniquement des noms de pa­
quets après la commande apt-get install sous Debian et Ubuntué®
Ces capacités dépendent fortement des shells, de leurs versions respec­
tives et aussi de la distribution ; essayez, vous serez peut-être agréablement
surprisé*.

La flèche vers le haut ( 1‘ ) permet de rappeler la dernière commande que


vous avez lancée ; vous pouvez alors simplement la relancer ou bien l’éditer
pour changer des arguments, des options, ou la commande elle-même. Des
pressions successives sur :4 $Ë permettent de remonter plus loin dans l’histo­
rique ; H sert alors à revenir vers les commandes plus récentes. En combi­
naison avec la complétion automatique, une utilisation rusée de l’historique
permet de limiter au maximum la quantité de texte à taper“°

c. Copier/coller
Ce n’est pas parce que l’on travaille en ligne de commande qu’il faut s’in­
terdire d’utiliser la souris. Elle est particulièrement utile pour copier/coller
62. On peut abuser de cette possibilité pour trouver des programmes travaillant sur un format
donné, voir page 69.
63. apt-get permet de gérer les logiciels installés sur un ordinateur sous Debian ou Ubuntu,
voir page 162.
64. Il est possible de configurer la complétion automatique de beaucoup de shells. Ceci dé­
passe le cadre de ce livre : veuillez vous référer à la documentation de votre shell.
65. D’autant plus que l’on peut définir des raccourcis, que l’on appele des « alias », pour les
commandes que l’on utilise souvent, voir page 95.
44 CHAPITRE 2 — KIT DE SURVIE

des éléments issus d’un autre programme ou de la sortie de commandes pré­


cédentes (comme find ou locate, voir pages 37 et 38). Il faut savoir que
le texte sélectionné à la souris dans le terminal est automatiquement copié
et peut être collé par un clic sur le bouton du milieu°S. Par ailleurs, un double
clic sur un mot le sélectionne en entier, et un triple clic sélectionne la ligne
entière67,
Résumé du chapitre
» On communique avec le shell par des — fichiers, les fichiers binaires et les
commandes qui acceptent des fichiers texte. On peut lire ces
d’un tiret). avec nano.
arguments et des options (précédées derniers grâce à 1ess et les éditer

» Les fichiers sont organisés selon une » On cherche des fichiers globaux avec
grande arborescence unique dont le locate et des fichiers locaux avec
répertoire « / » est la racine. find.
» 1s affiche le contenu des répertoires. » man commande est souvent la réponse
* mv, cp et rm servent respectivement à À bien des questions sur commande.
déplacer, copier et effacer. » La touche “}";Q complète
» Il existe deux grandes classes de automatiquement ce que l’on tape.

2.1 Caractères spéciaux


Parmis les noms de fichiers suivants, lesquels contiennent des caractères spé­
ciaux ?
UnNomLong un_autre! Laurel&Hardy.mpeg
mon_article.pdf Deux Mots ++-+_+.jpeg
Version[1] .doc $Des_sous$ chapitre-3.txt
2.2 Les mots pour le dire
On interagit avec le shell en tapant des Ls sc sn ns Celles-ci acceptent
dES Luc su se sr su se sr su s CL dES L uc s1 se su sn (qUi COMMEnNcent toujours par
un tiret -). . permet d’afficher le contenu des répertoires passés en argu­
ment. _……, cp et _ permettent respectivement de déplacer, _45_s_sses
et supprimer des fichiers et des répertoires. Pour ces derniers, il est nécessaire
de passer l’option … à cp et .. Enfin, ces trois commandes acceptent une
option .… pour demander confirmation avant d’écraser ou d’effacer un fi­
chier.

66. Sur la molette, ou bien sur les boutons droite et gauche en même temps s’il n’y en a pas.
67. La définition exacte de « mot », en particulier en ce qui concerne les signes de ponctuation,
varie d’un terminal à un autre et est généralement configurable.
2.8 — TROIS RACCOURCIS INDISPENSABLES 45

2.3 Jouez vos jokers


Voici le contenu d’un répertoire (les symboles &, #, Vet & ne font pas partie
des noms) :
% 1s -F
compile Fromages.tex- ®# Infos/ &
compile- $ image-01.jpeg Ÿ notes.txt
Fromages.jpeg # image-02.jpg Ÿ — Sauvegardes/ &
Fromages.pdf ® — image-03.JPGW _ script-sauvegardes
Fromages.tex ® — Image-04.jpeg Ÿ
Pour chacun des symboles &, #$, Vet #, écrivez un glob qui cible spécifiquement
les fichiers et/ou répertoires correspondants.
2.4 Commandes croisées

Horizontalement Verticalement
1. Lire des fichiers texte a. Éditer des fichiers texte
2. Effacer un répertoire et tout son
contenu
répertoire courant (dont les fichiers
. Trouver tous les fichiers du
cachés)
répertoire courant et de ses
sous-répertoires qui finissent par ­
. Trouver des fichiers dans l’ensemble 1s, et plus
du disque
. Effacer un répertoire vide
46 CHAPITRE 2 — KIT DE SURVIE

SOLUTIONS
2.1 Sans caractères spéciaux Avec caractères spéciaux
UnNomLong — mon _ article.pdf un_autre! Laurel&Hardy.mpeg
++-+_+.jpeg chapitre-3.txt Deux Mots Version[1] .doc
$Des_sous$
2.2 On interagit avec le shell en tapant des commandes. Celles-ci acceptent des argu­
ments et des options (qui commencent toujours par un tiret -). Ls permet d’afficher
le contenu des répertoires passés en argument. mv, cp et rm permettent respective­
ment de déplacer, copier et supprimer des fichiers et des répertoires. Pour ces derniers,
il est nécessaire de passer l’option -R à cp et rm. Enfin, ces trois commandes acceptent
une option -à pour demander confirmation avant d’écraser ou d’effacer un fichier.
2.3 Voici quelques globs répondants aux critères :
& : Fromages .* ou F*
+ : * (les fichiers finissant par - sont souvent des copies de sauvegarde)
V:ix.jpeg *.JPG *. jpg oOu i*g *G ou *e-x
ê:x/
Cette liste n’est bien sûr pas exhaustive ; en revanche, elle montre qu’il y a souvent

> T|
plusieurs manières d’écrire des globs. Entraînez-vous à trouver le plus compact !
2.4 d

2 S c|E e
|L|E|S[S| =|R[M| |-|R]
A| |- A |
s[F[1[N|D] |-[N[A[M[E| |\|*|\|-|
N| [L N P
L F
«iL[o|c[a|jr|e] | | s[R/M[DJI|R|
5 LF
Les outils de l’utilisateur
Chapitre

> Créer : des liens symboliques


Objectifs
> Agir: effectuer des sauvegardes, manipuler des documents
» Trouver : des fichiers ou des programmes
» Contrôler : les autorisations de fichiers

Maintenant que vous avez acquis les bases de la ligne de commande, nous
allons aborder une série d’outils pour manipuler fichiers et répertoires : gestion
des accès, archivage, manipuülation de documents, recherche avancée de fi­
chiers et de programmes.

3.1 Créez-vous des liens !


Il est souvent pratique de disposer de « raccourcis » pour des fichiers ou des
répertoires. Si l’on prépare un congrès à Marseille dans un répertoire nommé
Travail/Congres/Marseille2012, il est commode de pouvoir y accéder di­
rectement depuis le répertoire home, sans avoir à taper tout le chemin. On uti­
lise dans ce but Un LIEN SYMBOLIQUE (oU sYMLINK en anglais), que l’on crée
ainsi, depuis le répertoire home :
% 1In -s Travail/Congres/Marseille2012 Congres
N’oubliez pas le -s pour « symbolique » !
Le lien symbolique Congres est un raccourci vers le répertoire Travail/
Congres/Marseille2012: travailler sur « Congres » revient à travailler sur
Travail/Congres/Marseille2012. Ainsi,
% cd Congres
nous emmène en réalité dans Travail/Congres/Marseille2012.
La commande 1n -s* s’utilise tant sur les fichiers que sur les répertoires,
avec une syntaxe similaire à mv. Deux différences importantes: d’une part,
le fichier ou répertoire original reste en place, inchangé ; d’autre part, il faut
toujours lancer la commande depuis le répertoire où l’on veut placer le lien“.
1s -F (voir page 23) indique les liens symboliques par un arobase (@) :
1. Le -s est important; sans celui-ci, In crée un autre type de lien, qualifié de « dur » ou
« physique », similaire à première vue à un lien symbolique, mais avec des différences techniques
qui dépassent le cadre de cet ouvrage.
2. En effet, lancer In -s a/b a/c crée un lien a/c qui pointe vers a/a/b et non vers a/b.
48 CHAPITRE 3 — LES OUTILS DE L'UTILISATEUR

% 1s -F Congres
Congres@ @ pour un lien symbolique
% 1s -1 Congres
1rwxrwxrwx 1 vf vf 29 mai 8 11:09 Congres ->
“ | pour lien Travail/Congres/Marseille2012
Un lien symbolique est un fichier spécial qui contient un chemin, celui que
l’on a passé en premier argument de 1n -s. Quand on ouvre un lien symbo­
lique, le système d’exploitation suit le chemin qu’il contient. S’il est absolu,
il ouvre le fichier ou répertoire correspondant. S’il est relatif, il ouvre le fichier
ou répertoire désigné par le chemin, en partant du répertoire dans lequel le lien
se trouve. On peut lire le chemin contenu par le lien avec readlink:
h readlink Congres
Travail/Congres/Marseille2012
Supprimer ou déplacer un lien symbolique n’affecte que le lien (dans ce
cas, Congres), pas la cible (ici, Travail/Congres/Marseille2012). Si la
cible est supprimée ou déplacée, le lien est orphelin : il ne pointe vers rien.
Essayer de l’utiliser aboutit à une erreur du type « fichier non trouvé ». C’est
aussi généralement ce qu’il arrive lorsqu’on déplace un lien contenant un che­
min relatif.
À quoi servent les liens symboliques ?
Faciliter l’accès à des répertoires très hiérarchisés en fournissant un ac­
cès rapide à ceux que l’on utilise couramment.
Donner plusieurs noms à un unique fichier ou répertoire.
Utiliser un fichier ou un répertoire depuis plusieurs endroits.
— Eviter de copier le même fichier dans plusieurs répertoires.

3.2 Qui a le droit d’utiliser les fichiers ?


Dans les systèmes de type Unix/Linux, les actions des utilisateurs sur les
fichiers (lecture, modification et exécution, s’il s’agit d’un programme) sont
limités par un contrôle d’accès strict qui repose sur l’une des pierres angulaires
de ce type de systèmes : la notion d’utilisateurs et de groupes (d’utilisateurs).

a. Utilisateurs et groupes
Les « groupes d’utilisateurs »* servent à donner des permissions spécifiques
aux utilisateurs qui en font partie. Par exemple, les membres du groupe audio
2. C’est exactement celui que 1s -1 affiche après ->.
3. La création et la modification des groupes est réservée au super-utilisateur: on utilise
addgroup ou groupadd pour créer des groupes, et adduser ou useradd pour ajouter un utili­
3.2 — QUI A LE DROIT D’UTILISER LES FICHIERS ?

ont le droit d’utiliser la carte son, ceux du groupe cdrom peuvent lire des
CD et DVD, etc. On peut connaître les groupes dont on fait partie grâce à la
commande groups :
% groups Je suis membre des groupes vf, ady,
vf adm cdrom audio video = cdrom, audio et video.
Chaque fichier appartient à un unique utilisateur et à un unique groupe,
qui sont indiqués par 1s -1:
% 1s -1 Affiche.jpeg /var/log/debug
-rw-r--r-- 1Î v£f :…vf 323879 jan 4 2011 Affiche.jpeg
-rw-r----- 1 root adm 117987 mar 3 23:32 /var/1og/debug
Urtilisotteur // N Groupe

b. Autorisations
Pour l’accès à un élément de l’arborescence (fichier ou répertoire*), les
utilisateurs sont répartis en trois catégories :
— le propriétaire du fichier ;
— les membres du groupe du fichier (autres que son propriétaire) ;
— les autres.

À chacune de ces catégories correspond une série de trois caractères dans


la sortie de 1s -1: r ou —, w oOu - et x ou —, suivant que cette catégorie a ou
non le droit de lire (read), écrire (write) ou exécuter (execute) le fichier ou le
répertoire, dans cet ordre. Prenons l’exemple du fichier /var/10g/debug" :
% 1s -1 debug
TEWL IO 1 root adm 1179\87 mar 3 23:32 debug
1 5 5 Attention, la première lettre (ici -) ne compte pas
(voir encadré) !
L’utilisateur (u, ici root) a le droit de lire ce fichier, d’y écrire des infor­
mations mais pas de l’exécuter (rw-), car ce n’est pas un programme ; les
membres du groupe (g, ici ceux de adm) ont uniquement le droit de le lire
(r-—-), tandis que les autres (0, pour others, « autres »), n’ont aucun droit (—-—-).
Première lettre des permissions : type du fichier
La première lettre des permissions représente le type de l’objet que 1s exa­
mine : - pour un fichier, d pour un répertoire et 1 pour un lien symbolique.

sateur dans un groupe (utilisez préférentiellement adduser et addgroup s’ils existent).


4. Pour un lien symbolique, c’est très différent : tout le monde a le droit de lire le chemin
qu’il contient ; l’accès à la cible est basé sur les permissions de cette dernière. Personne ne peut
modifier un lien symbolique ; il faut le supprimer et le créer à nouveau si l’on souhaite changer
sa cible.
5. C’est un journal de l’ordinateur contenant des informations détaillés sur le fonctionnement
du système d’exploitation. De manière générale, /var/l0og contient les journaux du système.
50 CHAPITRE 3 - LES OUTILS DE L’UTILISATEUR

La permission d’exécuter intervient de manière différente suivant que l’ob­


jet concerné est un fichier ou un répertoire. Un fichier exécutable est un pro­
gramme ; ne peuvent le lancer que les catégories qui ont la permission de l’exé­
cuter. Ainsi, le programme /bin/1s, que l’on a utilisé sous le nom 1s, est
exécutable par tout le monde :
% 1s -1 /bin/1s
-rwxr-xr-x 1 root root 101992 jan 29 04:25 /bin/ls
La permission d’exécuter un répertoire, c’est celle de « rentrer à l’inté­
rieur », soit directement par cd, soit pour accéder à un fichier ou répertoire
qu’il contient : le lire, le modifier ou bien en connaître les autorisations. Ainsi,
pour lire le fichier /home/vf/Affiche. jpeg, il faut :
— le droit d’exécution des répertoires /, /home et /home/vf° ;
— le droit de lecture du fichier /home/vf/Affiche. jpeg.
La permission de lire un répertoire est simplement celle de connaître son
contenu (par 1s ou en utilisant un glob). La permission d’écrire dans un ré­
pertoire est celle d’y créer et supprimer des fichiers (y compris des fichiers qui
ne nous appartiennent pas). Ainsi, dans l’exemple ci-dessous, tous les utilisa­
teurs ont le droit de « rentrer » dans Admin et de le lire. En outre, l’utilisateur
vf, et lui seul, a le droit d’y créer et modifier des fichiers et répertoires :
% 1s -1d Admin
drwxr-xr-x 3 vf vf 4096 sep 3 2010 Admin
Cas particulier: le super-utilisateur
Le SUPER-UTILISATEUR, root, à toujours tous les droits sur tous les fichiers,
quelles que soient les permissions affichées.

rm demande confirmation avant d’effacer un fichier que l’on n’a pas le droit
de modifier”, à moins qu’on lui passe l’option -f (pour « forcer ») :

6. Le droit de lecture sur ces répertoires n’est pas nécessaire.


7. Rappelons qu’il n’est pas nécessaire d’être propriétaire d’un fichier pour le supprimer, il
suffit d’avoir le droit de modifier le répertoire qui le contient.
8. En anglais, ce serait: remove write-protected regular file ?
32— QUI A LE DROIT D’UTILISER LES FICHIERS ? 51

c. chmod: changer les permissions d’un fichier


On peut changer les permissions d’un fichier dont on est propriétaire. On
utilise dans ce but chmod (pour changer le mode d’accès), qui se lance de deux
manières différentes, suivant que l’on souhaite ajouter (ou enlever) certaines
permissions par rapport à celles déjà présentes sur le fichier, ou bien que l’on
veuille les définir entièrement.
Pour modifier les permissions, on indique d’abord quelle catégorie d’utili­
sateurs est concernée (u, g, o, ou bien a pour tous à la fois), puis + ou - suivant
que l’on donne ou retire des permissions, et enfin les permissions concernées
(r, w ou x):
Modifications des permissions existantes
chmod g+rw Affiche. jpeg autorise (+) les membres du groupe
(g) à lire et écrire (rw)
chmod go-r Affiche. jpeg retire (—) l’autorisation de lecture (r)
au groupe (g) et aux autres (0)
chmod a+x programme donne (+) à tous (a) l’autorisation
ou chmod +x programme d’exécuter (x) programme.
L’autre mode d’utilisation de chmod, permet de définir complètement les
permissions. Le premier argument est dans ce mode composé de trois chiffres
qui représentent respectivement les permissions pour le propriétaire, le groupe
et les autres, sous la forme d’une addition de 4 pour r, 2 pour w et 1 pour x.
Voici un exemple où l’utilisateur peut lire et écrire (6 = 4 + 2)), le groupe peut
seulement lire (4) et les autres n’ont aucun droit (0)° :
% chmod 640 article.pdf
% 1s -1 article.pdf
-rw-r----- 1 v£ v£ 23910 2010-01-19 22:06 article.pdf
Propriétaire : 6 = rw-, groupe : Ÿ = v-- et auttres : Ô = ---.

Permissions couramment utilisées


644 rw-r--r-- fichiers courants (lisibles par tous)
755 rwxr-xr-x programmes ou répertoires
600 rw------- fichiers privés
700 rwx------ programmes et répertoires privés
444 r--r--r-- fichiers « publics » en lecture seule
chmod accepte plusieurs fichiers et répertoires en argument :
% chmod go-rwx Affiche.jpeg article.pdf Admin
Il est par ailleurs possible d’appliquer chmod récursivement sur toute une
hiérarchie de fichiers, à l’aide de lP’option —R :
% chmod -R go-rwx Prive Supprime les permissions pour
tous les fichiers de Prive
9. Il s’agit de la représentation en base 8 des permissions.
52 CHAPITRE 3 — LES OUTILS DE L'UTILISATEUR

Pour autoriser à nouveau la lecture de tous les fichiers par tous, ce qui
nécessite les permissions d’exécution des répertoires, on serait tenté d’utiliser
% chmod -R go+rx Prive
Si cette commande donne effectivement les droits voulus, elle va bien au­
delà puisqu’elle rend tous les fichiers exécutables. Pour éviter ce problème,
on peut utiliser X à la place de x: cette spécification n’ajoute de permission
d’exécution à un élément que si celui-ci en présente déjà pour d’autres utilisa­
teurs (pour un répertoire ou un fichier exécutable) :
% chmod5-R go+rXexécutables.
fichiers Prive
Rend Prive; à nouveau public, sans rendre les

chgrp : changer des fichiers de groupes


On peut choisir librement le groupe des fichiers que l’on possède parmi les
groupes dont on fait partie (voir groups plus haut), au moyen de chgrp :
% chgrp audio Fichier.wav Assigne Fichier.wav au groupe audio
La commande chown permet de manière similaire de changer le propriétaire
du fichier, mais elle n’est utilisable que par le super-utilisateur.

Les permissions par défaut des fichiers créés par tous les programmes lan­
cés depuis un shell sont définies par un paramètre du nom de « umask », qui
contient les valeurs des permissions qui sont omises par défaut lors de la créa­
tion d’un fichier ou d’un répertoire dans le format « numérique » de chmod.
La valeur par défaut en est 022, ce qui veut dire qu’un nouveau fichier est, par
défaut, interdit à l’écriture pour le groupe et pour les autres (mais cela n’em­
pêche pas de rajouter ces permissions avec chmod par la suite). On modifie
la valeur de umask en utilisant la commande du même nom, qui permet aussi
de connaître la valeur actuelle :

%, umask
022
4 umask 077 Désactive par défauct toutes les permissions pour le
groupe et les autres

3.3 Les fichiers avoueront tout


Nous avons déjà employé file (page 27) pour connaître le type de don­
nées que contient un fichier. En complément de celui-ci, nous allons mainte­
nant voir une série d’outils pour extraire certaines informations des fichiers,
depuis l’espace qu’ils occupent sur le disque jusqu’aux nombres de lignes qu’ils
contiennent, en passant par leurs différences avec d’autres fichiers.
3.3 — LES FICHIERS AVOUERONT TOUT 53

a. du: quelle place occupe un répertoire


du (pour disk usage, « utilisation du disque ») affiche la place occupée sur
le disque par les répertoires donnés en arguments. Par défaut, il affiche leur
taille et celle de tous leurs sous-répertoires, en kilo-octets"” :
% du Admin
16 Admin/Impots/2012
232 Admin/Impots/2011
252 Admin/Impots
344 Admin

Principales options de du
-s supprime l’affichage des sous-répertoires
-c _ affiche la taille totale de tous les arguments
-h affiche la taille en Ko, Mo ou Go (comme pour 1s)
Pour estimer la taille d’une arborescence complexe, sans que l’information
ne soit noyée au milieu d’une multitude de sous-répertoires, on utilise!! :
% du -sh Programmation
5,4M Programmation
df : espace occupé sur le disque
| On utilise df, pour affichér l’espace utilisé (Uti .) et disponible (Di sp.) sur
/ tous les systèmes de fichiers (les partitions du disque) :
% df -h -k pour la taille en Ko, Mo et Go
Sys. de fichiers Taille Uti. Disp. Uti% Monté sur
/dev/sde1 37G 7,3G 28G 217 /
/dev/sde2 422G 319G 95G 78/% /home

stat (pour statut) affiche une foule d’informations sur les fichiers ou réper­
toires passés en arguments. Il s’agit en quelque sorte d’un 1s -1 plus fourni :
% stat Affiche. jpeg
File: ‘Affiche.jpeg’
Size: 323879 Taille Blocks: 648
IO Block: 4096 … fichier régulier ou répertoire, ou lien
Device: 346h/838d Inode: 1228857 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1002/ vf)
Gid: ( 1002/ vf) Perwissions et propriétaires
10. Sous Mac OS X, il faut l’option -k, sinon la taille est affichée en multiples de 512 octets.
11. On peut aussi tirer parti de l’option --maz-depth 1 pour limiter l’affichage au premier
niveau de la hiérarchie (sous répertoires), ou --max-depth 2 pour le second niveau (sous
répertoires et leurs sous-répertoires), etc.…
54 CHAPITRE 3 — LES OUTILS DE L’UTILISATEUR

Access: 2011-04-19 23:35:57.000000000 +0200


Modify: 2010-08-14 21:21:18.000000000 +0200
Change: 2011-04-19 22:29:00.000000000 +0200
stat apporte plusieurs éléments nouveaux!®. D’abord, il affiche de nom­
breux détails sur la facon dont le fichier est stocké sur le disque : son volume
physique (Device), son numéro interne (Inode), et le nombre de blocs qu’il
occupe dans le système de fichiers (Blocks). stat affiche en outre trois dates
distinctes :
— Access: la dernière fois que quelqu’un a lu le fichier ;
— Modify: la dernière fois que le fichier a été modifié (c’est celle que
1s -1 affiche par défaut) ;
— Change: la dernière fois que les attributs du fichier (autorisations, pro­
priétaires, etc.) ont été changés.
Notons que la signification précise de ces trois dates peut changer suivant
le système d’exploitation et sa configuration"*.

c. wc: décompte des mots et des lignes


wc (pour word count, « décompte des mots ») calcule des statistiques sur
les fichiers texte!* passés en argument :
Informations affichées par wc
;
-1 nombre delignes -w nombre de mots
-c nombre d’octets -m nombre de caractères!*

% wc chapitre_1i.tex chapitre_2.tex | Pas d'options = -lwe


295 2127 14637 chapitre_i.tex
1874 9016 66840 chapitre_2.tex
2169 11143 81477 total Lignes, mots et octets respectivement

d. strings: extraire du texte de fichiers binaires


Si les fichiers binaires sont incompréhensibles pour un humain dans leur
ensemble!6, il n’est en revanche pas rare qu’ils contiennent tout de même
des morceaux de texte, comme des commentaires sur la prise de vue dans
une image, des informations de copyright dans des programmes, etc. strings
(« chaînes de caractères », en anglais) sert précisément à les extraire. Voici
ce que donne strings sur une photo prise par un appareil numérique :
12. Loption -x est nécessaire pour avoir une sortie (presque} aussi détaillée sous Mac OS X.
13. Par exemple, l’administrateur de la machine peut décider de désactiver la mise à jour de
la date du dernier accès pour améliorer (légèrement) les performances.
14. wc fonctionne aussi sur les fichiers binaires, mais cela n’a généralement pas grand intérêt.
15. Celui-ci peut être plus petit que le nombre d’octets car, suivant les préférences linguistiques
en vigueur, il peut falloir plus d’un octet pour'représenter une lettre. C’est le cas par exemple
pour le jeu de caractères UTF-8 (voir page 102).
16. À moins qu’il ne s’agisse de fichiers texte compressés, voir zless page 59 pour les lire.
3.3 — LES FICHIERS AVOUERONT TOUT

% strings Photo. jpeg


#-Exif
EASTMAN KODAK COMPANY
KODAK DX7590 ZOOM DIGITAL CAMERA
0221
0100
2011:01:21 14:22:48
2011:01:21 14:22:48 [le reste est inintelligible ]
On découvre entre autres la marque de l’appareil et la date de la photo!”
strings sert typiquement à découvrir des commentaires, regarder les mes­
sages contenus dans un programme et en général trouver toutes sortes d’infor­
mations textuelles noyées dans une série de données binaires.

e. diff: comparer deux fichiers


diff (pour « différences ») sert à comparer deux fichiers. S’il s’agit de fi­
chiers binaires, diff se contente de signaler s’ils sont identiques ou non' :
% diff Affiche.jpeg article.pdf
Les fichiers binaires Affiche.jpeg et article.pdf
sont différents.!°
% diff Affiche.jpeg Affiche.copie.jpeg
Diff ne dit vien : les fichiers sont iderctiques.
Pour les fichiers texte, diff est plus informatif et affiche les lignes qui
se trouvent dans un fichier et pas dans l’autre. Celles présentes uniquement
dans le premier fichier sont introduites par <, tandis que celles présentes uni­
quement dans le second sont précédées d’un >. Voici un exemple sur deux
versions de ce chapitre qui ne diffèrent que par une faute d’orthographe :
% diff chapitre3.faux.tex chapitre3.tex
120c120 — La différence est à la ligne 120 des fichiers
< exécution, s’il s’agit d’un programme) sont limité par
> exécution, s’il s’agit d’un programme) sont limités par
Il est par ailleurs souvent utile de pouvoir replacer les lignes dans leur
contexte ; on se sert dans ce but de l’option -u :
% diff -u chapitre3.faux.tex chapitre3.tex
--- chapitre3.faux.tex 2012-07-08 01:57:03.367087859 +0200
+++ chapitre3.tex 2012-07-08 01:56:41.375087304 +0200
@@ -117,7 +117,7 @@

17. Dans le cas des photos numériques au format JPEG, il est plus astucieux d’utiliser exif ou
son cousin exiv2 qui donnent une foule d’informations supplémentaires, comme la focale, le
temps d’exposition, etc.
18. On peut tirer parti dans des tests (voir page 145) du fait que diff « réussit » si les fichiers
sont identiques, et qu’il « échoue » sinon.
19. Ou en anglais : Binary files Affiche.jpeg and article.pdf differ.
CHAPITRE 3 — LES OUTILS DE L’UTILISATEUR

Dans les systèmes de type Unix/Linux, les actions des


utilisateurs sur les fichiers (lecture, modification et
-exécution, s’il s’agit d’un programme) sont limité par
+exécution, s’il s’agit d’un programme) sont limités par
un contrôle d’accès strict qui repose sur l’une des
pierres angulaires de ce type de systèmes: la notion
d’utilisateurs et de groupes (d’utilisateurs).
Les lignes ajoutées dans la nouvelle version sont précédées d’un +, tandis que
celles qui ont disparu sont précédées d’un -. En outre, pour faciliter les com­
paraisons, diff affiche le nom et la date des fichiers concernés.
wdiff : différencier mot par mot
wdiff est un programme très similaire à diff, si ce n’est qu’il compare
les fichiers mot par mot (w pour word, « mot ») plutôt que ligne par ligne.
Il s’utilise de la même manière que diff. Il est recommandé d’employer
l’option -3, sans laquelle vdiff affiche, en plus des différences, l’intégralité
des parties communes aux deux fichiers, ce qui rend la lecture difficile.

3.4 C'’est dans quel fichier, déjà ?


Nous avons déjà utilisé locate et find pour rechercher des fichiers par
leur nom. Nous allons maintenant voir d’autres méthodes de recherche, basées
sur d’autres critères (taille, date, contenu).

a. 1s et ses options de tri


Par défaut, 1s trie les fichiers par ordre alphabétique. Pour son usage habi­
tuel, ceci suffit amplement. Cependant, d’autres ordres de tri peuvent rendre
de grands services pour retrouver les fichiers qui nous intéressent au milieu
d’un grand répertoire. Par exemple,

% 1s -1rS Le -l n’est pas nécessaire, mais souvent utile


trie les fichiers par taille (-S, size) croissante (-r, pour reversed, « inversé »,
car par défaut 1s affiche par ordre décroissant). Ainsi, les fichiers les plus gros
sont ceux affichés juste au-dessus de la nouvelle invite. De même,
% 1s -1rt
trie par date de modification (-t, pour time, « temps ») croissante (-r) : les der­
nières lignes sont donc les fichiers ou répertoires qui ont été modifiés en der­
nier. Bien sûr, cette méthode de « recherche » laisse grandement à désirer, mais
elle est souvent suffisante.
3.4 — C’EST DANS QUEL FICHIER, DÉJÀ ? 57

b. find, deuxième prise


find accepte une foison d’options permettant une sélection très précise
des fichiers et répertoires qu’il affiche ; nous avons déjà vu -name et -iname
page 38. En voici quelques autres particulièrement utiles :
Options principales de find: trouver les fichiers…
find -mmin -10 … modifiés il y a moins de dix minutes
find -mtime +7 … modifiés pour la dernière fois il y a
plus d’une semaine
find -newer fichier … plus récents que fichier
find -size +10M … de plus de 10 méga-octets (k, kilo, M,
méga, G, giga)
find -size -100k … de moins de 100 kilo-octets
find -size 12934 … de exactement 12934 octets
find -type d … qui sont des répertoires
find -type f … qui sont des fichiers usuels
find -type 1 … qui sont des liens symboliques
find \! -newer fichier .… qui sont plus vieux que fichier
Ces tests peuvent se combiner ; ainsi la commande
% find -name \*.pdf -mtime -2 -size +200k
affiche tous les fichiers PDF modifiés il y a moins de 2 jours et de taille supé­
rieure à 200 Ko dans le répertoire courant et ses sous-répertoires.
Comme précédemment, on peut aussi spécifier, en premier argument, le ré­
pertoire sur lequel on veut que find travaille”®. Ainsi, la commande
% find -/tmp -size -100k -size +50k -mmin +30
trouve tous les fichiers du répertoire -/tmp (et de ses sous-répertoires) dont
la taille est comprise entre 50 et 100 Ko et qui n’ont pas été modifiés au cours
de la dernière demi-heure.
Enfin, \! inverse le résultat d’un test*!. Ainsi,
% find \! -type 1
affiche les fichiers qui ne sont pas des liens symboliques (c’est-à-dire les réper­
toires et fichiers usuels).

c. grep: trouver les fichiers contenant un texte donné


L’utilitaire grep cherche un fragment de texte dans les fichiers donnés
en argument, et affiche les lignes qui le contiennent :
% grep Ko chapitre_2.tex chapitre_3.tex
chapitre_3.tex:Ko dans le répertoire courant
chapitre_3.tex:comprise entre 50 et 100 Ko et
20. Et c’est d’ailleurs une obligation pour Mac OS X, voir page 38.
21. find comprend des expressions logiques plus complexes (et/ou, groupage avec des paren­
thèses, etc…), référez-vous à sa documentation.
58 CHAPITRE 3 — LES OUTILS DE L’UTILISATEUR

Cette commande cherche le texte « Ko » dans les fichiers chapitre_2.tex


et chapitre_3.tex; elle n’en trouve que dans chapitre_3.tex. Le compor­
tement de grep est affecté par de nombreuses options :
Options principales de grep
-F désactive les fonctions de recherche avancées
-i ignore les différences majuscules/minuscules
-1, -2, etc. affiche 1, 2, etc., lignes de contexte
-1 affiche seulement le nom du fichier (pas la ligne)
-a force grep à travailler sur les fichiers binaires
-—v affiche les lignes où le texte n’est pas présent
-r recherche récursive dans l’arborescence
Tout comme less, grep donne par défaut une signification à certains ca­
ractères (|\O{}[1+*.77$) du texte à rechercher pour fournir des fonctionna­
lités avancées de recherche (voir page 127). Pour les désactiver, il faut utiliser
soit l’option -F ou soit fgrep, qui est un raccourci pour grep -F.
Les options -1, -2 sont utiles pour obtenir un peu plus de contexte autour
des occurrences du texte recherché :
% grep Ko -2 chapitre_2.tex chapitre_3.tex
chapitre_3.tex-les fichiers PDF modifiés il y a
chapitre_3.tex-moins de 2 jours et de plus de 200
chapitre_3.tex:Ko dans le répertoire courant
chapitre_3.tex-et ses sous-répertoires.
chapitre_3.tex-Comme précédemment, -2 : deux lignes de contexte
Par défaut, grep ignore les répertoires passés en argument. L’option -r
l’oblige à chercher aussi dans tous les fichiers qu’ils contiennent. En combinai­

son contenu : ­
son avec -1, on peut s’en servir pour trouver les fichiers contenant du texte, à
la find”®, si ce n’est que ce dernier travaille sur le nom du fichier et pas sur

% grep -r1 Ko
./chapitre_3.tex « {£o » est présent seulement
dans ces deux fichiers
./o1d/chapitre_3_sauvegarde.tex
Comme diff et 1less, grep traite les fichiers qu’il estime être « binaires »
de manière particulière, et se contente de dire s’ils contiennent le texte :
MedialBBox annonce la
% grep -F MediaBox article.pdf
Fichier binaire article.pdf concorde* 3 taille des pages dans
les documents PDF.
On peut le forcer à afficher les lignes trouvées à l’aide de l’option -a :
h grep MediaBox -a article.pdf
/MediaBox [0 O 612 792]
22. Ceci présente un intérêt en combinaison avec xargs (page 121) pour lancer des com­
mandes sur les fichiers trouvés ; une autre possibilité est d’utiliser cut -d : -£1 (voir p. 118).
23. En anglais, ce serait : Binary file article.pdf matches.
3.5 — COMPRESSER, SAUVEGARDER, ARCHIVER 59

Il ne faut utiliser cette option que si les données recherchées sont effective­
ment textuelles ; dans le cas contraire les résultats peuvent être imprévisibles
(il s’agit du même problème que celui décrit dans l’encadré ci-dessous).

3.5 Compresser, sauvegarder, archiver


Il existe plusieurs utilitaires en ligne de commande pour compresser des
fichiers et les archiver. Nous allons présenter les plus courants.

a. gzip et compagnie : compression de fichiers uniques


gzip compresse un fichier unique sans perte d’information :
% gzip chapitre_!.ps
crée un fichier compressé chapitre_1.ps.gz et supprime le fichier original.
Pour le restaurer, on utilise gunzip, qui réalise l’opération inverse (et supprime
le fichier compressé) :
% gunzip chapitre_1.ps.gz
On .peut lire le contenu d’un fichier compressé sans le décompresser au
préalable avec zcat, qui envoie son contenu directement sur le terminal**,
ou avec zless, qui équivaut à lancer 1ess sur le fichier décompressé :
% zcat chapitre, 1.tex.gz
% zless chapitre_1.tex.gz
Attention : fichier binaires et terminal

Certains logiciels peuvent ouvrir des fichiers compressés de façon transpa­


rente. Par exemple, gv et evince, qui affichent des fichiers PostScript“° et PDF
travaillent directement sur des fichiers .ps.gz et .pdf .gz.
Si gzip est le plus courant des programmes de compression, il n’est pas le
seul. Parmi ses concurrents, on peut citer bzip2 et 1zma”°, qui sont tous deux
sensiblement moins rapides que gzip, mais qui compressent mieux (bzip2 est
plus courant que 1zma). Ils s’emploient de la même manière que gzip:

brièvement page 65. '


24. Comme le ferait cat sur le fichier décompressé, voir page 112.
25. Le format PostScript est un format de documents similaire au PDE nous y reviendrons

26. Il y a aussi xz, le successeur de 1zma, qui n’est pas encore très répandu.
60 CHAPITRE 3 — LES OUTILS DE L’UTILISATEUR

Compression de fichiers
Compression gzip bzip2 1zma
Décompression gunzip bunzip2 unlzma
Envoi surleterminal :zcat bzcat 1zcat
Envoi vers less zless =— bzless (aucun)?7
Extension des fichiers .gz .bz2 .1zma

b. tar : l'archiveur du monde Unix


tar (pour tape archiver, « archiveur sur bandes ») est l’archiveur par ex­
cellence du monde Unix ; il permet de grouper une série de fichiers et de ré­
pertoires dans un fichier unique, une ARCHIVE, qui est plus facile à stocker ou
échanger que l’ensemble initial. Il est nommé ainsi car il a été conçu pour fonc­
tionner correctement même s’il est utilisé avec des bandes magnétiques, ce qui
n’est pas le cas de la plupart des programmes similaires. Il fonctionne a for­
tiori avec les disques durs, les clés USB, etc. Il ne compresse pas lui-même les
fichiers, mais délègue cette tâche à des programmes comme gzip ou bzip2.
Créer une archive : tar cvzf
La commande
% tar -cvf Archive.tar Repertoire
[Liste des fichiers archivés ]
crée (-c) une archive non compressée du répertoire Repertoire, dans le fi­
chier Archive.tar. L’option -v affiche la liste des fichiers effectivement archi­
vés, et -f introduit le nom de l’archive”.
En général, il est désirable de compresser l’archive créée“°. S’il est possible
de la compresser avec gzip, il est plus judicieux de créer directement un fichier
compressé en passant l’option -z°. tar peut archiver plusieurs répertoires
ou fichiers d’un coup. On peut en outre se passer du - introduisant les options :
% tar cvzf Archive.tar.gz Repertoirei Repertoire2

gP
tar archive tous les fichiers des répertoires passés en arguments, y com­
pris ceux des sous-répertoires et les fichiers cachés. On peut exclure certains
fichiers à l’aide de l’option --exclude, qui s’utilise comme l’option -name
de find (page 38). Ainsi, la commande
% tar cvzf Archive.tar.gz --exclude \*- Repertoire
27. Il n’y a pas de programme pour envoyer directement de 1zma à less, mais on verra
page 116 qu’il est très facile de pallier ce manque.
28. Certaines versions de tar interprètent les « : » dans le nom de l’archive comme désignant
des machines distantes. Évitez-les !
29. À moins que les fichiers ne soient déjà compressés, comme des photos ou des vidéos,
auxquel cas la compression supplémentaire ne gagne pas de place et fait perdre du temps.
30. Ceci évite la création d’un fichier intermédiaire non compressé volumineux.
3.5 — COMPRESSER, SAUVEGARDER, ARCHIVER 61

crée une archive de Repertoire en laissant de côté tous les fichiers dont
le nom finit par - (ce sont en général des fichiers temporaires). Exclure un ré­
pertoire par ce mécanisme exclut aussi tout son contenu. Il est enfin possible
de passer directement des fichiers à archiver en argument.
Le nom de l’archive est l’argument de l’option f ; en conséquence, il ne faut
pas placer --exclude ou une autre option entre f et le nom de l’archive.
Autrement dit, f doit toujours être le dernier de la liste d’options.
On peut compresser l’archive avec bzip2 en remplaçant le z par un j** :
% tar cvjf Archive.tar.bz2 Repertoire
Afficher plus d'informations : l’option -v ou --verbose
Une grande majorité des programmes utilisables en ligne de commande
acceptent une option -v, ou --verbose ou -verbose (« bavard ») qui les
invite à être plus loquaces sur leurs actions. Ainsi, tar muni de l’option
-v affiche le nom du fichier qu’il est en train d’archiver, cp celui du fichier
qu’il copie, etc. Ces options permettent de suivre l’avancement d’une com­
mande et de comprendre ce qu'elle fait. Par ailleurs, ces options sont parfois
cumulatives : -vv peut donner plus d’informations que -v.

Restaurer une archive : tar xvzf


La commande
% tar xvzf Archive.tar.gz
restaure (-x, pour extraire) le contenu de Archive.tar.gz exactement tel
qu’il était. En l’occurrence, tar crée un répertoire, Repertoire, dans le réper­
toire courant et rétablit les fichiers qu’il contenait à la création de l’archive ;
il respecte la hiérarchie originelle.
Attention aux fichiers existants !

On peut extraire une partie de l’archive seulement, soit en passant en argu­


ment les noms des fichiers à extraire (voir la section suivante pour connaître
le contenu de l’archive), soit, par la négative, grâce à l’option --exclude :
% tar xvzf Archive.tar.gz Repertoire/rapport.pdf
Extroit seulement le fichier Repertoire/rapport.pdf
% tar xvzf Archive.tar.gz --exclude \*.ps
Extrait tous les fichiers sauf les .ps
31. Et, pour les versions récentes, tar cvJf pour une compression par xz.
62 CHAPITRE 3 — LES OUTILS DE L’UTILISATEUR

tar (et les autres programmes) et les liens symboliques


tar a deux manières de traiter un lien symbolique : soit il le stocke
en tant que tel dans l’archive, soit il en stocke la cible. Suivant les cas,
on peut préférer l’un à l’autre. Par défaut, tar stocke le lien, mais on peut
lui faire stocker la cible au moyen de l’option -h.
La plupart des programmes ne font pas la différence entre un lien sym­
bolique et sa cible, et c’est le comportement que l’on attend : un lien s’uti­
lise de la même manière que sa cible. Cependant, pour les programmes
similaires à tar, il est important de pouvoir faire la différence. Quand l’un
de ces programmes copie la cible du lien, on dit qu’il le « suit ». Pour les pro­
grammes décrits dans ce livre, nous vous donnerons les options adéquates ;
pour les autres, cherchez des options pour « suivre » ou « déréférencer » les
liens symboliques (follow ou dereference en anglais).

La commande
% tar tvzf Archive.tar.gz
teste (-t) l’intégrité de Archive.tar.gz, en affichant par la même occasion
la liste des fichiers qu’elle contient.
Récapitulons
Créer…
… une archive de Repertoire compressée par gzip
- tar cvzf Archive.tar.gz Repertoire
…une archive de Repertoire compressée par bzip2
- tar cvjf Archive.tar.bz2 Repertoire
… une archive de Repertoire omettant les fichiers finissant par ­
- tar cvzf Archive.tar.gz Repertoire --exclude \*­
Extraire…
… tous les fichiers de Archive .tar .gz (compressée avec gzip)
- tar xvzf Archive.tar.gz
… tous les fichiers de Archive. tar.bz2 (compressée avec bzip2)
- tar xvjf Archive.tar.bz2
… Uniquement Un/fichier et Autre/Fichier
- tar xvzf Archive.tar.gz Un/fichier Autre/Fichier
… tous les fichiers sauf les fichiers PDF
- tar xvzf Archive.tar.gz --exclude \*.pdf
. Afficher/vérifier le contenu d’archives
3.6 — MANIPULER DES IMAGES ET DES PDF 63

c. Les archiveurs universels: zip, 7z


Si tar est indubitablement l’archiveur le plus utilisé du monde Unix, les
archives qu’il produit sont en revanche beaucoup moins bien gérées par les
autres systèmes d’exploitation. Pour échanger avec d’autres systèmes, il est
préférable d’utiliser les archiveurs génériques zip ou 7z, ce dernier étant plus
récent et beaucoup plus performant en termes de compression**. Ils s’utilisent
de manière assez similaire à tar :

Créer ; ;
Action Commandes
; zip -r Archive.zip Repertoire
, z à Archive.7z Repertoire
. unzip Archive.zip
Extraire 7Z x Archive.7z
Afficher zipinfo Archive.zip
7Z 1 Archive.7z

Archives et sauvegardes

3.6 Manipuler des images et des PDF


Il existe des milliers d’utilitaires en ligne de commande permettant d’effec­
tuer des opérations diverses et variées sur toute une foule de types de docu­
ments. Il n’est bien sûr pas possible de tous les présenter ; nous avons choisi
de vous décrire des utilitaires servant à manipuler d’une part des images
et d’autre part des documents PDF (et aussi PostScript). Nous verrons page 68
comment trouver le programme qui convient pour réaliser d’autres opérations.

a. Manipulation d'images avec ImageMagick


La suite logicielle ImageMagick fournit un ensemble d’outils pour mani­
puler des images. Le plus utile de ceux-ci est convert (« convertir »), dont
la fonction première est de convertir des images entre différents formats”*,
comme dans la commande suivante** :
32. Il utilise le même algorithme que 1zma et xz.
33. convert, tout comme les autres programmes de la suite ImageMagick, est capable de
travailler avec une centaine de formats différents.
34. On en verra page 127 une écriture plus compacte.
64 CHAPITRE 3 — LES OUTILS DE L’UTILISATEUR

% convert image.jpeg image.png


Cette commande crée un fichier image .png, qui contient la même image
que image. jpeg, mais stockée dans le format PNG plutôt que JPEG.
Attention !
convert écrase le fichier cible, ici image . png, sans autre forme de procès.

Lorsque le format de départ ou d’arrivée est vectoriel”?, il faut en préciser


la résolution avec l’option -density (en points par pouce) :
% convert image.jpeg -density 150 image.pdf
% convert -density 150 figure.pdf figure. jpeg
-denstty se place avant le fichier vectoriel (ici au format PDF)
% convert image.jpeg -density 150 eps2:image.ps
L’utilisartion de « eps2 : » produit un Postscript beaucoup plus compact
Par défaut, la nouvelle image est aussi fidèle à l’ancienne que le format
de destination le permet. On peut cependant demander à convert de la mo­
difier. Ainsi, l]a commande
k convert image.jpeg -resize 160x120 icone. jpeg
retaille (-resize) l’image pour qu’elle tienne dans un rectangle de 160 par
120 points sans pour autant la déformer°®. On peut aussi demander d’enlever
la bordure”” grâce à l’option -trim (tailler) :
% convert. image.jpeg -trim sans-bordure. jpeg
convert accepte une quantité impressionnante d’autres options permet­
tant de rajouter des dessins ou des textes, de filtrer, de composer plusieurs
images, etc. Les possibilités sont immenses et dépassent largement le cadre
de cet ouvrage. Pour en savoir plus, consultez la page Web de convert”S, qui
contient des centaines d’exemples bien détaillés.
N'utilisez pas de globs avec convert !
Comme beaucoup d’autres utilitaires effectuant une conversion entre
formats, convert ne travaille que sur une seule image à la fois. N’utilisez
pas de globs avec convert ! Les résultats peuvent être imprévisibles, impli­
quant entre autres la destruction d’une partie importante des images concer­
nées par la commande.
Cette limitation peut paraître très gênante pour manipuler un grand
nombre d’images, mais nous verrons pages 122 et 152 des méthodes pour
travailler sur un nombre arbitraire de fichiers, un par un.

35. Nous reviendrons sur cette notion à l’occasion de la commande pdfimages, p. 67.
36. L'image finale aura soit une largeur de 160, soit une hauteur de 120, et l’autre dimension
s’ajustera suivant la taille de l’original.
37. C’est-à-dire une bande unie entourant l’image.
38. À l’adresse www. imagemagick.org/script/convert.php.
3.6 — MANIPULER DES IMAGES ET DES PDF 65

display, un autre programme de la suite ImageMagick, affiche les images


dans une fenêtre graphique” :
k display image. jpeg Affiche image.jpeg
Le programme montage, quant à lui, arrange une série d’images en une
image unique composée de leurs miniatures, pour réaliser un index :
h montage -label %f images*.jpg index. jpg
L’option -label %f affiche le nom du fichier au-dessous de chaque minia­
ture. Il y a encore d’autres programmes de la suite, pour comparer des images,
réaliser des compositions, des captures d’écrans, et bien d’autres opérations
encore ; ils sont décrits dans ImageMagick(1).

b. Convertir un PDF en PostScript et vice-versa


Les deux formats les plus utilisés pour stocker des documents « impri­
mables » (textes, figures…) sont le PostScript et le PDE Ces documents ne sont
en général pas éditables facilement, mais ils peuvent être inclus dans d’autres
documents. Nous ne décrirons que des outils pour manipuler des documents
PDE car ils sont en général plus robustes. Les documents PostScript et PDF
sont en pratique interchangeables, puisqu’il est aisé de convertir l’un en l’autre
au moyen de l’une des commandes suivantes“°

% ps2pdf document.ps —> PDF : documents de plusieurs pages


% epstopdf docüment.ps —> PDF : document d’une page
% pdftops document.pdf — PS :+ous documents
Comme convert, ces commandes ne peuvent travailler que sur un seul
fichier à la fois ; n’utilisez donc pas de globs !

c. pdftk: la « boîte à outils » des PDF


pdftk, pour PDF tool kit (« boîte à outils ») est un utilitaire pour manipu­
ler les fichiers PDF : réorganiser les pages, chiffrer/déchiffrer, gérer les formu­
laires, les fichiers attachés… Nous allons ici vous présenter les opérations les
plus courantes ; référez-vous à pdftk(1) pour les autres.
Voici comment on manipule les pages de fichiers PDF : cette commande
crée un fichier doc2.pdf contenant les pages 1 à 12 (1-12) et celles à partir
de 45 (45-end) du fichier doc .pdf.
h pdftk doc.pdf cat 1-12 45-end output doc2.pdf
Bien respecter l’ordre : pdftk fichier cat pages output fichier de sortie
On peut combiner deux fichiers d1 . pdf et d2.pdf en d3. pdf :
% pdftk d1i.pdf d2.pdf cat output d3.pdf
39. Il existe d’autres afficheurs en ligne de commande, comme x1oadimage, xli, xv...
40. ps2pdf est fourni avec le logiciel Ghostscript, epstopdf avec FTEX et pdftops avec xpdf
ou bien poppler.
66 CHAPITRE 3 — LES OUTILS DE L’UTILISATEUR

Pour des compositions plus compliquées, on donne un nom aux fichiers d’en­
trée avec un signe =:
% pdftk A=di.pdf B=d2.pdf cat A1-12 B4-8 output d3.pdf
Cette commande place dans d3.pdf les pages 1 à 12 de ÀA (soit d1.pdf)
et les pages 4 à 8 de B (d2.pdf).
On peut aussi utiliser cette syntaxe pour tourner les pages d’un fichier, en
rajoutant R, L ou S après les numéros des pages pour spécifier si l’on souhaite
les tourner de 90° dans le sens horaire (R, pour right, « droite »), anti-horaire (L
pour left, gauche) ou à 180° (S pour symétrique). Par exemple, la commande
suivante produit un fichier doc2. pdf avec les pages 4 à 8 de doc . pdf tournées
de 90° dans le sens des aiguilles d’une montre :
% paftk doc.pdf cat 4-8R output doc2.pdf
Enfin, la commande suivante scinde document .pdf en une série de fichiers
pg_0001 .pdf, pg_0002.pdf, etc., contenant chacun une unique page :
% pdftk document .pdf burst

d. pdfnup: « plusieurs pages par page »


PDFjam est une suite d’outils complémentaires de pdftk pour manipuler
des documents PDF ; pdfnup en est le plus utile. Il arrange un document en re­
groupant plusieurs pages sur chaque feuille (voir figure ci-après), par exemple
dans le but de l’imprimer. Ainsi, la commande
% pdfnup document.pdf
produit un fichier document-2x1 .pdf"! avec deux pages du document initial
sur chacune de ses feuilles.

Page 1 n Page 2

--nup 3x2
41. Ou document-nup.pdf pour les versions récentes.
3.6 — MANIPULER DES IMAGES ET DES PDF 67

L'option --nup permet de changer le nombre et la disposition des pages.


Ainsi, la commande suivante produit un fichier document-3x2.pdf*" avec
6 pages par feuille organisées en 3 colonnes et 2 lignes :
% pdfnup --nup 3x2 document..pdf

Manipulation de fichiers PostScript

e. pdfcrop: ajuster les marges d’un PDF


pdfcrop”“ redimensionne un PDF de sorte à ne laisser aucune marge :
h pdfcrop figure.pdf figure-sans-marges.pdf
ou un peu de marge, avec l’option --margins:
h pdfcrop --margins 6 figure.pdf figure-taillee.pdf
crée un fichier figure-taillee.pdf avec des marges de 6 points*.
pdfcrop peut être très lent sur certains documents, en particulier s’ils com­
prennent de nombreuses pages. Pour avoir une idée de l’avancement du pro­
cessus, utilisez l’option --verbose.
Astuce

f. pdfimages : extraire les images d'un PDF


Il existe deux grandes catégories d’images que l’on peut utiliser sur un or­
dinateur : d’une part, des images bitmap, dans lesquelles l’information est sto­
ckée sous la forme d’une série de points juxtaposés (par exemple pour des
photos) ; d’autre part, des images vectorielles, qui sont en réalité des instruc­
tions de dessin (dessine une ligne ici, un cercle là, etc.). La différence fonda­
mentale entre les deux est qu’une image bitmap a une résolution maximale,
et l’agrandir davantage donne une image « pixelisée », composée de carrés
de couleur, tandis qu’une image vectorielle peut être agrandie à volonté sans
perte de qualité. Les documents PDF peuvent contenir des images des deux
types. pdf images** est capable d’en extraire les images bitmap :
% pdfimages document.pdf image
42. Fourni avec IéTEX.
43. 72 points = 1 pouce = 2,54 cm, done 1 cm = 28,3 points et 1 mm = 3 points.
44, Qui se trouve dans le même paquet que pdftops.
68 CHAPITRE 3 - LES OUTILS DE L’UTILISATEUR

Cette commande crée autant de fichiers du type image-000.ppm”° qu’il


y a d’images bitmap dans document .pdf. L'option -j permet d’enregistrer
directement au format JPEG les images qui sont déjà sous ce format dans
le fichier PDE
pdfimages ne peut extraire que les images. C’est le cas pour les photos,
mais pas nécessairement pour les figures: si ces dernières sont sous forme
vectorielle, pdfimages ne les trouvera pas.

Manipulations d'images et de PDF


convert convertit et manipule des images
display affiche des images
ps2pdf convertit un document PostScript en PDF
epstopdf = convertit une figure PostScript en PDF
pdftops convertit un document PDF en PostScript
pdfnup organise un PDF en « plusieurs pages par feuille »
pdfcrop retaille au plus juste les pages d’un document PDF
pdfimages extrait les images bitmap d’un document PDF
pdftk « boîte à outils » des documents PDF

3.7 Comment trouver le bon programme


Terminons ce chapitre par quelques conseils pour trouver le logiciel qu’il
vous faut afin de réaliser une tâche donnée depuis le shell. Le nombre de pro­
grammes écrits pour la ligne de commande est si grand qu’il y a fort à parier
qu’il en existe déjà un pour réaliser ce dont vous avez besoin. Il ne reste qu’à
le trouver !

a. … s’il est déjà installé


Si vous connaissez déjà des programmes travaillant avec le type de fichiers
que vous souhaitez manipuler, commencez par chercher plus en avant dans
leur page de man : ces programmes sont peut-être munis de l’option qui fait
ce que vous voulez. Si ce n’est pas le cas, les sections « voir aussi » peuvent
se révéler d’une aide précieuse dans votre recherche.
Une autre manière de trouver le bon programme est d’utiliser apropos
pour chercher des pages de man par mots-clés :
% apropos xml
sgml2xm1 (1) - convert SGML to XML
xjc (1) - Java(TM) Architecture for XML Binding
XML: :Parser (3pm) - À perl module for parsing XML documents
[..]
-45. Les extensions peuvent changer, vérifiez avec 1s -1rt par exemple.
3.7 — COMMENT TROUVER LE BON PROGRAMME 69

Puisque apropos cherche par défaut dans toutes les sections des pages
de man““, cette commande retourne parfois des entrées correspondant à des
bibliothèques de programmation, comme XML : : Parser ci-dessus, qui est un
module de Perl pour lire des fichiers XML. Pour se restreindre aux programmes
(section 1), on utilise :
% apropos -s 1 xml
sgml2xml (1) - convert SGML to XML
xjc (1) - Java(TM) Architecture for XML Binding
[….]

Par défaut, si l’on cherche plus d’un seul mot, apropos retourne les pages
de man contenant l’un ou l’autre. Pour restreindre aux pages ne contenant que
les deux, on utilise -a :
% apropos -a PDF xm1 Pages de man contenant PDF et XL
pdftohtml (1) - program to convert PDF files into HTML,
XML and PNG images
Enfin, il est fréquent que les programmes travaillant sur un format aient
un nom commençant par le format. Ainsi, pour se faire une idée approximative
des programmes travaillant avec le format PDF installés sur votre ordinateur,
on peut tirer parti de la complétion automatique du shell :
% pâf + w1 + } —
pdf2dsc pdfetex pdfnup pdftoppm
pdf2ps pdffonts pdfopen pdftops
[etc… ]

b. … s’il n'est pas installé


Commencez par jeter un œil à l’index (page 169) et au tableau récapitulatif
des commandes (page 9), vous trouverez peut-être votre bonheur !
Dans le cas contraire, le plus simple est de faire appel aux outils de re­
cherche de « PAQUETS » spécifiques au système de votre ordinateur. Ainsi, sur
une machine Debian (ou Ubuntu), la commande
% apt-cache search PDF
affiche les paquets (installés ou non) dont la description contient le mot PDF.
Recherche de « paquets »
Debian, Ubuntu apt-cache search PDF
Fedora, RedHat yum search PDF
Gentoo emerge -S PDF
Arch Linux pacman -S --search PDF
Fink (Mac OS X) fink list PDF
MacPorts (Mac OS X) port search PDF
46. Voir la liste complète des sections page 40.
70 CHAPITRE 3 — LES OUTILS DE L’UTILISATEUR

Si ceci ne suffit pas, il faut chercher sur Internet. Avant de se lancer dans
une recherche globale via Google ou un autre moteur de recherche géné­
rique, il est souvent intéressant de chercher d’abord sur sourceforge.net
et freshmeat .net : ces sites (en anglais seulement) rassemblent de nom­
breux programmes, le plus souvent des logiciels libres fonctionnant sous Linux.
De plus, ces sites offrent des possibilités de recherche avancées, permettant
de sélectionner selon des critères précis de système d’exploitation, de licence,
d’environnement, etc.
Pour finir, notons qu’il arrive que ce que l’on souhaite faire puisse se dé­
couper en opérations plus simples qui sont déjà prises en charge par certains
programmes. Par exemple, s’il est vrai que man ne produit pas directement des
fichiers PDE il est aisé de lui faire d’abord produire du PostScript que l’on peut
convertir en PDF grâce à ps2pdf. Nous verrons au chapitre 7 comment écrire
des programmes simples permettant de réaliser ce type d’enchaînements‘”.
Résumé du chapitre
Les fichiers et répertoires hiérarchie de fichiers entre deux
appartiennent à un utilisateuretäun … répertoires.
groupe, sur lesquels le système
; n find se > sont
et grep des alliés précieux
base pour autoriser ou non l’accès. pour (re)trouver des fichiers.
» On utilise tar en combinaison avec , Il existe des programmes pour
gzip (ou bzip2 ou 1zma) pour réaliser (presque) tout ce que l’on
archiver des fichiers. veut. apropos aide à trouver ceux qui
rsync synchronise efficacement une sont déjà installés.

3.1 Les mots pour le dire


Chaque fichier ou répertoire appartient à UN __ s0 se sr su sr Et à UN
rs nn dutilisateurs. On modifie les autorisations d’un fichier dont on
ESt urr su se rrs sn s AVEC la commande __sus, et le groupe au­
quel il appartient avec __ Pour accéder à un fichier, en plus des per­
missions appropriées sur ce fichier, il faut la permission d’_1_+_srs se sn le
rrs se st rs es QUI le contient.
3.2 Bien connaître ses droits
Un amie (login ab) ne comprend pas pourquoi la commande suivante échoue :
% less fichier
fichier: Permission non accordée
alors qu’elle a tous les droits sur ce fichier :
47. Et en particulier page 142 pour convertir une page de man en PDF
3.7 — COMMENT TROUVER LE BON PROGRAMME 71

% 1s -1 fichier
1rwxrwxrwx 1 ab ab 11 nov. 11 02:34 fichier
-> /etc/shadow
Pouvez-vous lui expliquer ce qui se passe ?
3.3 Commandes croisées

Horizontalement Verticalement
1. Les groupes dont je fais partie a. Pour créer le fichier tri .gz
2. Toutes les pages de man sur man b. Supprimer toutes les permissions
3. Comparer des fichiers aux « autres »
4. Décompresser une archive tar c. Chercher du texte
compressée par gzip d. L’espace restant sur le disque
e. Utiliser £ à la place de a
72 CHAPITRE 3 — LES OUTILS DE L’UTILISATEUR

SOLUTIONS
3.1 Chaque fichier ou répertoire appartient à un utilisateur et à un groupe d’utilisateurs.
On modifie les autorisations d’un fichier dont on est propriétaire avec la commande
chmod, et le groupe auquel il appartient avec chgrp. Pour accéder à un fichier, en plus
des permissions appropriées sur ce fichier, il faut la permission d’exécuter le répertoire
qui le contient.
3.2 Le fichier en question est un lien symbolique : les permissions qui sont données par

3.3 , . ,
1s -1 ne nous renseignent que sur la possibilité par votre amie d’accéder au lien
(ce qui est toujours possible), mais pas forcément au fichier cible. En l’occurrence,
/etc/shadow est la base de donnée des mots de passe des utilisateurs de la machine,
dont la lecture est réservée à l’utilisateur root ; créer un lien vers ce fichier ne permet
pas de passer outre ses permissions !

c|
H| [6 L
|R N
“z|-\nd s| . jM| |E |
[c|rjo|u|r[s] |-|
:[A|P|R|O|P|0|S| |M|A|N|
T| [R| -[p[r|F|[F
« T[A|R| |X|V|z|F
({} (W
Gérer le temps et le réseau
Chapitre

b Interagir : avec des serveurs (Web, SSH, FTP) distants


» Agir: planifier des tâches
Objectifs

> Contrôler : l’exécution de commandes

Dans ce chapitre, nous allons aborder quelques-unes des possibilités of­


fertes par la ligne de commande pour voyager dans l’espace (interagir avec
des ordinateurs distants) et dans le temps (le futur surtout, via la planification
de tâches).

4.1 Sessions shell distantes


Un des atouts de la ligne de commande est qu’elle se prête facilement
à une utilisation à distance, parce que les informations échangées se limitent
au minimum : quelques lignes de texte.

a. SSH: un shell distant sûr


Le système SSH (pour secure shell, « shell (distant) sécurisé ») offre la pos­
sibilité de se connecter à une machine distante, d’y ouvrir un shell et d’y lancer
des commandes comme sur une machine locale. Outre le côté pratique, ce sys­
tème est sûr, car la connexion est chiffrée : ni les mots de passe, ni les données
échangées ne peuvent être interceptés par un tiers!. On l’utilise ainsi :
Y% ssh vf@machine.distante.org Mot de passe pour vf sur
vf@machine.distante.org password: achine.distarcte.org
Cette commande ouvre une session shell de l’utilisateur v£ sur le ser­
veur SSH machine .distante.org, Pour que ceci fonctionne, il est nécessaire
qu’un serveur SSH soit installé sur machine.distante.org, et bien sûr que
vous y possédiez un compte au nom de vf”. Une fois votre mot de passe ac­
cepté, une nouvelle invite apparaît :
Linux machine 3.1.0 Description de la machine distante
Last login: Thu Nov 03 17:10:44 2011 from [...]
Date et ovigine de la session shell précéderte
% Invite du shell de la machine distante
1. On utilisait auparavant telnet pour exécuter des commandes à distance, mais ce dernier
n’est pas chiffré et inférieur en tous points à SSH.
2. Il n’est nu! besoin d’avoir du matériel de « qualité serveur » pour abriter un serveur SSH ;
il s’agit juste d’installer le logiciel approprié. Nous verrons dans l’encadré page 77 comment
mettre en place des serveurs SSH sur un réseau domestique.
CHAPITRE 4 — GÉRER LE TEMPS ET LE RÉSEAU

Cette nouvelle invite est affichée par le shell de la machine distante : les
commandes suivantes tourneront sur celle-ci, jusqu’à ce que vous lanciez la
commande exit pour terminer le shell distant et revenir au shell local*.
La première fois que vous vous connectez à une machine distante, ssh
vous signale qu’elle lui est inconnue :
The authenticity of host ’machine.distante.org’
can’t be established.
L’authenticité de machine.distante.org n’a pas pu être établie.
RSA key fingerprint is — L’empreinte de sa clé RSA est …
f9:5d:f14:d8:5c:d0:84:b2:6c:17:3b:d3:74:7c:e5:f6.
Âre you sure you want to continue connecting (yes/no)?
Etes-vous sûr de vouloir vous connecter (oui/mon) ?
En effet, à chaque serveur SSH correspond une clé qui l’identifie de manière
certaine. Ce message vous invite à vérifier que le serveur est bien celui que
vous pensez* ; tapez « yes » (oui) pour accepter la clé. Si, lors d’une connexion
ultérieure, la clé a changé, ssh vous le fait savoir et refuse catégoriquement
de se connecter :
eadacceceaceceaaRAcecACaRACAGCCACACECCCCCCACACACACACE
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
eacacacacañaaararAacAacAGRACOCACACACACEACACCCACACACACE
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
[..] La clé problématique est à la ligne I :
Offending key in /home/vf/.ssh/known_hosts:9
Ceci peut indiquer une tentative d’interception de la connexion, mais plus
souvent, c’est la conséquence d’une mise à jour du serveur. Il faut dans ce cas
éditer le fichier -/.ssh/known_hosts pour supprimer l’empreinte obsolète.
Astuce : ouvrir un fichier à une ligne précise avec nano
Pour supprimer la clé fautive, on peut exploiter le fait que nano, ainsi que
emacs, vim et d’autres éditeurs de texte, se positionne directement à la ligne
numéro 9 si on le lance de cette manière :
% nano +9 -/.ssh/known_hosts

h display image. jpeg


display: unable to open X server ‘’.
3. On peut aussi utiliser ”D, voir page 91. Tous deux fonctionnent aussi pour terminer un shell
local. Si jamais le shell distant ne répondait plus, on peut terminer une session en appuyant sur
ËÎÂ;{ puis les deux lettres « - . ».
4. En pratique, cela n’est pas souvent possible, à moins que la machine sur laquelle vous vous
connectez publie une page Web présentant l’empreinte de sa clé (fingerprint en anglais).
4.1 — SESSIONS SHELL DISTANTES

On peut passer outre cette limitation en donnant l’option -X à ssh (à condi­


tion que le serveur soit configuré pour l’accepter). Soyez averti néanmoins que
cette possibilité est très gourmande en ressources réseau : sans connexion ra­
pide entre les deux machines, l’interface sera peu réactive.
Astuce : ouvrir un terminal distant
La commande suivante ouvre un terminal (xterm) directement connecté
à machine distante.org:
% xterm -e ’ssh -X vf@machine.distante.org’

Si l’on a juste besoin de lancer une commande unique, il est possible de la


passer directement en argument à ssh. Dans ce cas, la session se termine dès
que la commande est finie. Ainsi,
% ssh vf@machine.distante.org 1s -1
affiche le résultat de la commande 1s -1 sur la machine distante et redonne
la main au shell local“.
Commandes qui prennent des commandes en argument
Quand on passe une commande en argument à ssh, vatch”, ou à d’autres
programmes, il est indispensable d’échapper tous les caractères spéciaux
pour éviter que leur iÏ1terprétation ait lieu trop tôt (sur la machine locale
au lieu de la machine distante par exemple pour ssh). Ceci est vrai pour les
globs, mais aussi pour les redirections et les pipes (que l’on verra pages 111
et 115). Pour éviter tout problème, il est préférable d’utiliser des guillemets
simples (voir page 125) :

b. Authentification par clé


Si taper son mot de passe à chaque connexion est acceptable pour une
utilisation peu fréquente d’une machine distante, cela devient rapidement la­
borieux pour des connexions répétées (en particulier lorsqu’on utilise des pro­
grammes basés sur SSH, voir encadré page suivante). Par ailleurs, la nécessité
de taper un mot de passe empêche toute connexion automatique®. C’est pour­
quoi les développeurs de SSH ont conçu un système d’authentification alterna­
tif aux mots de passe, basé sur un système de clés publique et privée : la clé
5. Les alias sont des raccourcis pour des commandes fréquemment utilisées, voir page 95.
6. Combiné aux pipes que l’on verra page 115, ceci permet de travailler confortablement
sur le résultat de commandes distantes, par exemple : ssh vf@machine .distante.org find
-name \*.pdf | less.
7. watch suit l’évolution du résultat d’une commande au cours du temps, voir page 85.
8. Par exemple dans le cadre de tâches planifiées, voir page 88.
76 CHAPITRE 4 — GÉRER LE TEMPS ET LE RÉSEAU

publique permet à l’ordinateur de construire une « question » à laquelle seul


le détenteur de la clé privée correspondante peut répondre. Pour se connec­
ter sans mot de passe à une machine, il suffit de rajouter la clé publique
dans la liste des clés autorisées sur la machine distante, dans le fichier dis­
tant -/.ssh/authorized_keys.
SSH : au-delà du shell
La sécurité et l’ubiquité de SSH en ont fait un standard pour échanger de
manière sûre des données entre des ordinateurs. Il est ainsi utilisé de fa­
çon transparente par des applications de transfert de fichiers (scp, sftp
et rsync, voir plus loin) ou de gestion de versions (Subversion, Git, etc.).

% ssh-keygen
Generating public/private rsa key pair.
Génération d’une paire de clés publique/privée RSA.
Enter file in which to save the key Nowm du fichier où
(/home/vf/.ssh/id_rsa) : sauver la clé
Enter passphrase (empty for no passphrase) :
Entrez le mot de passe, ou Enrée! pour une clé sans mot de passe.
Enter same passphrase again: Tapez à nouveau le mot de passe
Ce programme demande où enregistrer la clé privée” : tapez directement
sur eqÿ%çë pour sauver à l’emplacement par défaut (-/.ssh/id_rsa), puis
deux fois sur '%ç{rééâ. Pour utiliser cette clé, il n’y a plus qu’à rajouter le contenu
du fichier local -/.ssh/id_rsa.pub (la clé publique"°) à la fin du fichier dis­
tant -/.ssh/authorized_keys. La manière la plus simple de le faire est* :
% ssh-copy-id vf@machine.distante.org
Quand la clé privée est stockée sur un ordinateur multi-utilisateur!*, il est
fortement recommandé de la protéger par un mot de passe, que l’on tape
deux fois lors de la création (pour éviter les erreurs). Pour se servir la clé,
il faut taper le mot de passe utilisé lors de la création. Pour éviter de revenir
à la situation initiale, on utilise ssh-add qui déprotège la clé pour la durée de
la session graphique en cours :
% ssh-add !! faut donner le mot de passe de la clé pour ln déprotéger
9. La fichier contenant la clé publique aura le même nom, avec .pub rajouté à la fin.
10. Il ne faut jamais copier -/.ssh/id_rsa, qui contient la clé privée.
11. Cette commande n’est pas disponible sous Mac OS X; on copie le clé « à la main »,
avec la commande: ssh vf@machine.distante.org ’cat - >> .ssh/authorized_keys?
< -/.ssh/id_rsa.pub (attention aux guillemets !).
12. Si ceci n’est pas nécessaire sur un ordinateur mono-utilisateur, gardez à l’esprit que tous
les utilisateurs avec des droits d’administration sur une machine peuvent usurper une clé non
protégée.
4.2 — ÉCHANGER DES FICHIERS 77
Enter passphrase for /home/vf/.ssh/id_rsa:
Identity added: /home/vf/.ssh/id_rsa
Mise en place de SSH sur un réseau domestique
Ÿ Si vous possédez plusieurs ordinateurs connectés à Internet à la mai­
son, vous pouvez mettre en place des serveurs SSH sur chacun d’eux
et vous connecter de l’un à l’autre. Pour cela, il suffit d’installer le pa­
quet openssh-server ou simplement openssh sur les ordinateurs en ques­
Ÿ tion!®. Ensuite, il faut obtenir l’adresse IP (sur le réseau local) des ordina­
Ÿ teurs, en utilisant :
- /sbin/ifconfig | grep ’inet addr’ inet addr = adresse IP
inet addr:192.168.1.30 Bcast:192.168.1.255
Mask:255.255.255.0 \ l’est celle-ci
inet addr:127.0.0.1 Mask:255.0.0.0
L’adresse IP qui sert à se connecter est celle qui ne commence pas par 127
(qui est un réseau local privé à l’ordinateur seulement) :
- ssh vf@192.168.1.30 À lancer sur une auctre machine !
Faites attention cependant à ce que votre box soit pourvue d’un pare­
feu (c’est souvent le cas) et qu’il soit activé, sinon des indésirables pourront
essayer de se connecter sur vos machines depuis l’extérieur.

L’un des principaux attraits d’un réseau est la possibilité d’échanger des
fichiers entre ordinateurs ; c’est particulièrement facile en ligne de commande.

a. scp et rsync: comme si on y était !


Certains utilitaires travaillent aussi bien avec des fichiers locaux qu’avec
des fichiers distants ; c’est le cas de scp, une version de cp pouvant travailler
avec des fichiers distants. Par exemple,
% scp vf@machine.distante.org:rapport.tzxt . — il yaune.»
copie le fichier rapport .txt de l’utilisateur vf de machine.distante.org
dans le répertoire courant. Si le chemin distant est relatif (ce qui suit le « : »
ne commence pas par « / »), il l’est par rapport à votre répertoire home sur
la machine distante. De même,
% scp Lettre.txt vf@machine.distante.org:Textes

13. Voir page 69 pour trouver le nom exact du paquet et page 162 pour l’installer.
78 CHAPITRE 4 — GÉRER LE TEMPS ET LE RÉSEAU

copie le fichier local Lettre.txt dans le répertoire Textes sur la machine


distante!*. On peut aussi employer des globs, à condition de les échapper
quand il s’agit de fichiers distants. Comparez :
% scp *.txt vf@machine.distante.org:Textes Mais :
% scp vf@machine.distante.org:\*.pdf Articles
Pour copier efficacement toute une hiérarchie de fichiers, il est préférable
d’utiliser rsync (pour remote synchronization, « synchronisation à distance »),
qui reconnaît les données déjà présentes sur la machine distante et ne copie
que le strict nécessaire*!* :
% rsync -av Source vf@machine.distante.org:Sauvegardes
Copie le répertoire Source dans Sauvegardes sur la machine distante
% rsync -av vf@machine.distante.org:Source Cible
Copie le répertoire distaxt Source dans le répertoire local Cible
L’option -a copie le plus fidèlement possible (comme avec cp), et -v af­
fiche les noms des fichiers copiés!®. rsync est très utile pour effectuer des
sauvegardes, et il fonctionne aussi en local :
% rsync -av Source Sauvegardes
Copie le répertoire Source dans Sauvegardes
En plus de -a et -v, rsync est doté d’une foule d’options contrôlant la ma­
nière dont il travaille :

Principales options de rsync


-Z compresse les données échangées!”
--exclude … exclut des fichiers (Ccomme pour tar, p. 60)
--progress _ affiche des informations sur l’avancement du transfert
-L « suit » les liens symboliques (copie leur cible)
--checksum détection approfondie des différences!S
-b garde une copie des fichiers cibles avant de mettre
à jour leur contenu
--suffix choisit le suffixe des fichier copiés par --backup
On réalise des sauvegardes incrémentales en combinant -b (backup) et
--suffix:
% rsync -avb --suffix .old Source Sauvegardes
14. Ou bien sous le nom de Textes s’il n’y a pas de répertoire Textes sur la machine distante.
15. Un bémol: rsync ne fonctionne que s’il est aussi installé sur la machine distante.
16. Un second -v, comme dans rsync -avv, affiche aussi les fichiers qu’il n’a pas besoin de
copier parce qu’ils sont déjà à jour.
17. Ceci peut accélérer le transfert via une ligne ADSL, mais c’est en général inutile sur un
réseau local.
18. Par défaut, si un fichier cible à la même taille et date/heure de dernière modification,
rsync suppose qu’il est identique au fichier source ; cette option le force à en vérifier le contenu.
4.2 — ÉCHANGER DES FICHIERS 79
Avec ces options, si un fichier document .txt a été modifié depuis la dernière
synchronisation, l’ancien contenu est renommé document .txt.old'!*.
rsync et les /
rsync se comporte différemment suivant que la source se termine ou non
par un /:
% rsync -av Source/ Cible
synchronise Source avec Cible, tandis que
% rsync -av Source Cible

rsync et scp utilisent ssh dans les coulisses pour se connecter aux ordina­
teurs distants : ces programmes peuvent donc tirer parti des clés sous réserve
que vous en ayez créées, bien sûr.

b. FTP: l'incontournable du transfert de fichiers


Le protocole FTP”° sert à échanger des fichiers avec un ordinateur distant
abritant un serveur FTP Si ces derniers offrent moins de possibilités qu’une
connexion SSH (pas d’exécution de commandes par exemple), ils sont en re­
vanche plus répandus : par exemple, les hébergeurs de sites Web mettent très
souvent des serveurs FTP à disposition de leurs clients pour leur permettre
de déposer leurs pages.
Il existe de nombreux clients FTP (programmes permettant d’interagir avec
un serveur FTP) en ligne de commande, comme ftp, ncftp, 1ftp, etc. Ils s’uti­
lisent tous de la même manière, via une interface comparable à celle du shell
et qui peut être plus ou moins élaborée, de la complétion automatique pour
les plus raffinés à l’absence complète de possibilité d’édition des commandes
pour les plus rudimentaires. Voici par exemple comment se déroule l’envoi
d’un fichier sur le serveur ftp.fai.fr avec le client ftp:
% ftp
ftp> open ftp.fai.fr*! Ftp> est l’invite du client FTP
\ci, l peut parfois y avoir des messages du serveur
220 FTP server ready Le serveur est prêt
Name (ftp.fai.fr:vf): vf Login sur le serveur ?
331 Password required for vf. |l ‘ËW:Ÿ donner le mot de passe
Password: pour l’wtilisorteur vf
230 User vf logged in. Le mot de passe est accepté
Remote system type is UNIX.
19. S’il existait déjà, document .txt.old est écrasé ; utilisez un suffixe qui change à chaque
appel pour éviter ceci (basé sur date, par exemple).
20. Pour File Transfer Protocol, « protocole de transfert de fichiers ».
21. Pour certains clients FTP il est nécessaire de donner aussi le nom d’utilisateur sur le serveur,
de la manière suivante : open vf@ftp.fai.fr.
Le fichier est bien transtéré

open ftp.fai.fr se connecter au serveur ftp.fai.fr


open vf@ftp.fai.fr se connecter avec le login v£**
put Fichier envoie le fichier local Fichier sur le serveur*
get Fichier télécharge le fichier distant Fichier®
cd Repertoire change de répertoire sur le serveur
1s affiche le contenu du répertoire courant sur
le serveur**
lcd Repertoire change de répertoire sur la machine locale
rename source cible renomme source en cible sur le serveur
delete Fichier
rm Fichier supprime le fichier distant Fichier*
mput *.pdf envoie plusieurs fichiers d’un coup
mget *.jpeg télécharge plusieurs fichiers d’un coup
close termine la connexion au serveur
? affiche la liste les commandes disponibles
help commande affiche une petite aide sur conmande
quit quitte le client

On peut aussi utiliser ncftpget“° pour télécharger des fichiers directe­


ment depuis la ligne de commande, sans passer par l’interface d’un client, par
exemple depuis des scripts ou des tâches planifiées”” :
% ncftpget ftp://ftp.fai.fr/repertoire/fichier
télécharge le fichier repertoire/fichier sur le serveur ftp.fai.fr. Entre
autres options, on peut spécifier un login et un mot de passe via -u et -p.
22. La syntaxe à utiliser pour open dépend de votre client ; essayez la première, et s’il ne vous
demande pas de nom d’utilisateur, utilisez plutôt la seconde.
23. Certains clients, comme ncftp, acceptent une option -R à put et get, qui permet de copier
récursivement un répertoire complet.
24. Certains clients, comme ncftp, disposent d’une commande 11s qui affiche le contenu du
répertoire courant local.
25. Suivant le client, soit delete, soit rm fonctionne.
26. Ce programme est fourni avec le client interactif ncftp.
27. Voir respectivement pages 137 et 86.
4.3 - LE WEB 81
Enfin, les serveurs SSH peuvent aussi échanger des fichiers comme des
serveurs FTP via le client spécifique sftp, qui s’utilise de la même manière
qu’un client FTP traditionnel**.
l1ftp: un client FTP puissant
1ftp est doté d’une interface confortable avec, entre autres, une com­
plétion automatique intelligente. Il fournit surtout une commande, mirror,
qui reproduit l’effet de rsync, en étant quasiment aussi efficace. Pour télé­
charger le contenu d’un répertoire distant, on utilise la commande
> mirror repertoire_distant repertoire_local
et pour envoyer un répertoire vers le serveur FTP on utilise :
> mirror -R repertoire_local repertoire_distant
Tout comme sftp, l1ftp peut interagir avec un serveur SSH (voir
lftp(1) pour plus détails), ce qui permet d’utiliser mirror comme sub­
stitut à rsync quand celui-ci n’est pas installé sur la machine distante.

La mention du Web appelle immanquablement des pages visuellement at­


trayantes affichées dans un navigateur graphique. Pourtant, il y a bien d’autres
manières d’utiliser 1le Web, dont beaucoup depuis la ligne de commande.

a. Le Web non-interactif
wget télécharge des fichiers accessibles sur le Web, qu’il s’agisse de pages
Web (des documents HTML), d’images ou de documents. Par exemple,
h wget vww.gnu.org/software/bash/manual/bash. pdf
télécharge la documentation de la dernière version de bash (au format PDF),
et la sauve dans le répertoire courant.
Cette méthode convient pour télécharger des fichiers, mais est mal adap­
tée à des pages que l’on souhaiterait visionner localement, d’une part parce
qu’il manque tous les documents nécessaires à l’affichage de la page (images,
feuilles de styles), et d’autre part parce que la plupart des liens, tirés de leur
contexte d’origine, ne sont plus corrects. L'utilisation des options -pH et -k
permettent de pallier l’un et l’autre de ces problèmes :
% wget -pHk fr.wvikipedia.org/wviki/Unix
télécharge la page wikipédia sur Unix, ainsi que tous les documents néces­
saires pour la visionner et les place dans le répertoire fr.wikipedia.org.
28. Si ce n’est qu’il n’est pas nécessaire d’installer un serveur FTP sur la machine distante.
82 CHAPITRE 4 — GÉRER LE TEMPS ET LE RÉSEAU

curl s’utilise de manière similaire à wget, mais il envoie par défaut le


contenu du fichier qu’il télécharge dans le terminal*’. cur1 prend tout son
sens avec les pipes (page 115), qui permettent de travailler directement sur sa
sortie.
wget et cur]l sont tous deux dotés de fonctionnalités très avancées, comme
la possibilité de remplir des formulaires en ligne (via leurs options respectives
--post-data et -F) et le téléchargement de fichiers sur des serveurs FTP :
h wget ftp://ftp.fai.fr/repertoire/fichier

b. Navigateurs Web en mode texte


lynx, w3m et elinks sont des navigateurs Web comme Firefox ou Safari,
qui travaillent exclusivement en mode texte: pas d’images“°, ni de vidéos,
ni de sons… Ils se lancent de la manière suivante :
% 1ynx lynx.isc.org — La page à visionner en argument est obligattoire
On navigue à l’aide des flèches : haut et bas pour aller de lien en lien, droite
pour suivre un lien, et gauche (ou B) pour revenir à la page que l’on vient de
quitter*!. Ces navigateurs présentent des avantages qui les font préférer aux
autres dans des situations particulières :
— Comme ils ne téléchargent ni les images, ni les animations, ils sont sou­
vent plus fluides que les navigateurs traditionnels, en particulier sur une
connexion lente.
— Puisqu’ils fonctionnent uniquement en mode texte, ils peuvent être uti­
lisés à travers une connexion SSH, pour consulter un site Intranet par
exemple.

c. Clients mail en mode texte


mutt et alpine“? sont des clients de messagerie électronique, comme
Thunderbird ou Outlook, mais ils fonctionnent en mode texte. On pourrait
les croire obsolètes ou restreints à des usages précis comme l’est par exemple
lynx par rapport aux navigateurs classiques, mais il n’en est rien. mutt par
exemple jouit d’une popularité plus grande que Thunderbird chez les utili­
sateurs de Debian**. S’il est vrai que, à l’instar de la ligne de commande, ces
clients sont d’un abord aride, leur apprentissage permet de gérer des centaines
de courriers quotidiens de manière plus efficace que leurs compétiteurs gra­
phiques. Ceci est possible via des raccourcis claviers bien pensés : par exemple,
29. curl -o save enregistre la page qu’il télécharge dans le fichier « save », Symétriquement,
wget -D - affiche ce qu’il télécharge dans le terminal.
30. Une exception notable: w3m peut afficher des images s’il est lancé depuis un terminal
xterm.
31, Ces programmes offrent bien d’autres fonctionalités, comme par exemple 1lynx -dump qui
convertit la page demandée en simple texte.
32. alpine est le descendant de pine, qui n’est plus développé.
33. D'’après les statistiques disponibles sur le site popcon.debian.org.
4.4 — LE TEMPS DU CALENDRIER 83

dans alpine, on navigue dans les courriers avec les flèches, on affiche la liste
des dossiers en appuyant sur <, on répond à un mail avec r, etc. Ces clients
sont de plus entièrement configurables.
Bon à savoir : lecture des messages locaux
De nombreux services fonctionnant en tâche de fond sur les machines
Unix communiquent avec les utilisateurs via un serveur de mail local
à la machine. C’est le cas par exemple pour at et cron (voir pages 88
et 86). alpine et les autres clients mails en mode texte permettent
de lire ces messages; c’est eux qu’il faut utiliser quand le shell vous
dit« You have new mail » (vous avez des nouveaux messages).

mail distante.
Envoi de mails et configuration des serveurs de messagerie
Un serveur de messagerie est automatiquement installé sur toutes les ma­
chines Unix. C’est lui qui permet à alpine de recevoir et d’envoyer du cour­
rier. Par défaut, ce serveur est configuré pour fonctionner localement. Pour
envoyer des mails à l’extérieur, il est nécessaire de le reconfigurer pour lui
faire utiliser le serveur de messagerie de votre fournisseur d’accès (confi­
guration en mode « smarthost »). Le serveur s’appelle souvent exin, exim4,
postfix ou sendmail ; référez-vous à sa documentation.

La ligne de commande est dotée d’utilitaires efficaces pour manipuler les


temps et les dates ; voici les plus courants.

a. La date et l'heure
date affiche la date et l’heure courantes :
k date
vendredi 1 juin 2012, 09:27:27 (UTC+0200)
UTC+0206 est le fuseau horaire de la France à l’keure d’été

Son principal intérêt est que l’on peut contrôler finement le format d’af­
fichage de la date en passant en argument un format commençant par « + »
et contenant des séquences de caractères avec les significations suivantes** :

34. Cette liste n’est pas exhaustive, référez-vous à date(1) pour plus d’informations.
84 CHAPITRE 4 — GÉRER LE TEMPS ET LE RÉSEAU

Séquences spéciales pour date


Ya jour du mois (de 01 à 31) YY année
Ym mois de l’année (de 01 à 12) YH heure (de 00 à 23)
%M minute (de 00 à 59) 43 seconde (de 00 à 59)

% date +%d/%m/hY
01/06/2012
% date +4H\ heures\ %M Les espaces doivent être échappés, sauf
09 heures 27 si on wctilise des guillemets, voir page (25

date prend tout son intérêt en combinaison avec une construction du shell
basée sur les guillemets inverses « ‘ ». Quand le shell rencontre ces derniers,
il exécute la commande qui se trouve entre eux et la remplace par son résultat.
Par exemple, pour dater précisément des archives, on peut utiliser :
% tar cvzf docs-‘date +%Y-%m-%d-/Hh%M‘ .tar.gz docs
Au moment de lancer cette commande, le shell remplace la partie entre guille­
mets inverses par son résultat ; la commande réellement exécutée est donc
% tar cvzf docs-2012-06-01-09h27.tar.gz docs
On peut tirer parti des guillements inversés pour simplifier la réalisation
de sauvegardes incrémentales avec rsync :
h rsync -avb --suffix “‘date +.%Y/m%d‘ Source Cible
Il est judicieux de définir des alias (voir page 98) pour éviter d’avoir à taper
l’argument de date à chaque fois.
À vous de jouer
Plutôt que de nommer les archives selon la date du jour, on souhaite les
placer dans un répertoire du type Archives/année/mois/jour. Comment
créer ce répertoire pour la date d’aujourd’hui ?
*LE o8ed 104 ‘a:oauau‘eJ ap
stour np sertouedes saj no sed s] mod aressoogu 353 d- uondo,] ‘,PA/04/2%+ o3ep,/seatyorxy d- ITpAU opueurUIOO EJ J°0UE] 3P 3YMS [I

b. Un calendrier
La commande nca1”°135 affiche un calendrier sur plusieurs mois ou sur une
année. La date du jour est mise en valeur. On l’utilise sous les formes sui­
vantes :
% ncal Le mois en cours
Juin 2012
lu & 11 18 25
ma 5 12 19 26
me 6 13 20 27
je 7 14 21 28
35. C’est le successeur de cal.
4.4 — LE TEMPS DU CALENDRIER 85

ve H 81522 29
sa 2 9 16 23 30
di 3 10 17 24
% ncal -3°6 Affiche aussi mai et juillet
%h ncal 2012 L’année 2012 en entier
% ncal 7 2012 ;
% ncal juillet 2012 }5W“e”f 2012
% ncal ‘date +4Y‘37 Toucte l’année en cours
Attention, ncal 12 n’affiche pas l’année 2012, mais bien l’année 12 !

c. Combien de temps prend une commande ?


time mesure le temps qu’une commande prend pour s’exécuter. On l’utilise
en la plaçant avant la commande concernée, comme ceci:
% time locate Declaration.pdf
/home/vf/Admin/Impots/2011/Declaration.pdf
/home/vf/Admin/Impots/2012/Declaration.pdf

real … 0m2.099s Temps réel


user 0m1 .956s Temps « utilisateuwr »
sys 0m0 . 036s Temps « système »
Après le résultat de la commande, time affiche les trois temps qu’il a me­
surés. Le temps réel (real) est le temps qui s’est effectivement écoulé entre
le début et la fin de la commande. Le temps « utilisateur » (user) est le temps
passé à exécuter le code du programme proprement dit, typiquement pour
faire des calculs ou interpréter des données ; ici il est passé à décoder la base
de données de 1ocate. Le temps « système » est le temps passé à exécuter des
appels système, par exemple la lecture ou l’écriture de fichiers, la manipula­
tion de périphériques, etc. Ces deux derniers temps sont comptés en secondes
par cœur, donc si un programme peut utiliser plusieurs cœurs, le temps réel
peut être plus petit que la somme des temps utilisateur et système.
Bon à savoir
uptime affiche le temps écoulé depuis le démarrage de l’ordinateur.

watch permet de suivre l’évolution du résultat d’une commande en la lan­


çant à intervalles réguliers.
% vatch 1s -1 fichier
Every 2,0s: 1s -l fichier Fri Jun 3 09:55:27 2011
Fréqueuce/ ©Stommande lancée _ Date du dernier lancement ”
-rw-r--r-- 1 vf£f vf 737280 juin 3 09:55 fichier
36. Cette option n’est pas disponible sous Mac OS X.
37. On pourra utiliser un alias (voir page 95) : alias cal.an=’ncal ‘date +4Y‘>.
86 CHAPITRE 4 — GÉRER LE TEMPS ET LE RÉSEAU

watch continue à lancer répétitivement la commande jusqu’à ce qu’on l’in­


terrompe au moyen de ÊÈÎÊC (voir page 92).
On peut contrôler la fréquence d’exécution à l’aide de l’option -n, qui
prend un argument en secondes. Tirons parti de watch et de la commande
from, qui affiche la liste des expéditeurs et des dates des mails locaux (voir
encadré page 83) pour suivre l’arrivée des mails toutes les minutes :
% watch -n 60 ’from | tail? L’espace ewtre -n et son
argument peut être omis.
La partie | tail restreint l’affichage aux 10 dernières lignes de la fin du ré­
sur cette construction. \
sultat de from, pour voir les derniers mails arrivés. Nous reviendrons page 115

Tout comme ssh, watch prend une commande en argument: il est né­
cessaire de porter une attention spéciale aux jokers et autres caractères spé­
ciaux (voir encadré page 75). Ainsi, pour suivre le téléchargement d’une série
de photos, il ne faut pas lancer
% watch -n 60 1s -1 *.jpg — watch ne voit jamais le « * »
mais
% watch -n 60 ’1s -1 *.pdf? Correct

4.5 Planification de tâches


Contrairement aux programmes munis d’une interface graphique, la ligne
de commande se prête facilement à la planification des tâches : il suffit de pré­
ciser la commande que l’on souhaite exécuter et quand. On utilise deux pro­
grammes différents suivant que l’on veut exécuter une commande de manière
régulière (cron) ou pour une seule fois (at).

a. cron: exécution régulière de tâches


cron exécute des tâches régulières, comme des sauvegardes ou des net­
toyages. On le pilote via des fichiers spéciaux appelés des CRONTABs (cron
table, « tableau pour cron ») que l’on édite en lançant la commande“S
% crontab -e
et qui ressemblent à ceci :
# sauvegardes incrémentales hebdomadaires (voir p. 78)
10 12 * * O rsync -avb --suffix ‘date +.%YAM{d‘ data saves
Les lignes commençant par # sont ignorées par cron et servent générale­
ment à documenter les lignes contenant les commandes proprement dites. Ces
dernières sont dans un format bien défini. Les cinq premiers champs, séparés
par des espaces (ou des tabulations), décrivent les moments où la commande
est exécutée :
38. Cette commande utilise l’éditeur par défaut, indiqué dans la variable d’environnement
$EDITOR, voir page 99. On peut de plus afficher le crontab avec la commande crontab -1.
4.5 — PLANIFICATION DE TÂCHES 87

10 12 * * 0
—Ss R— —— p
minute heure jour dumois — moisdel’année = jour de la semaine (0 = dimanche)

« * » signifie comme à son habitude « n’importe lequel ». L'ensemble se lit


donc « à 12 heures 10, quel que soit le jour du mois et le mois de l’année,
pourvu que ce soit un dimanche », soit encore « tous les dimanches à midi dix ».
La commande proprement dite occupe la fin de la ligne. Ici, il s’agit de rsync,
utilisé pour créer une sauvegarde du répertoire data. Voici par exemple com­
ment programmer un nettoyage des fichiers temporaires dans le répertoire
Documents deux fois par jour :
# suppression des fichiers *- (fichiers temporaires)
O 0,12 * * * rm -v Documents/*/*­
Puisque les commandes à exécuter ne sont pas passées en argument, mais
tapées directement, il n’est pas nécessaire de prendre des précautions particu­
lières avec les caractères spéciaux (contrairement à watch et ssh, voir p. 75).
cron (et at) envoient le résultat des commandes qu’ils exécutent par mail
local, qu’on peut lire avec alpine ou mutt (voir p. 82). Ceci permet ici de rece­
voir la liste des fichiers supprimés grâve à l’option -v de rm (qui lui fait afficher
chaque fichier qu’il supprime). cron (et at) lancent leur commandes « tous
seuls », sans interaction avec l’utilisateur. En conséquence, les commandes qui
ont besoin d’une information extérieure échouent ; c’est par exemple le cas
de rsync sur une machine pour laquelle il faut un mot de passe. Il n’y a pas
de moyen de contourner cette limitation, il faut donc s’arranger autrement“”.
Le crontab principal est le fichier /etc/crontab, qui ne peut être modifié
que par le super-utilisateur*°. Chaque utilisateur dispose en outre d’un crontab
personnel ; c’est lui que l’on modifie via crontab -e.
cron et les machines éteintes
cron exécute les tâches à l’heure prévue. Si l’ordinateur est éteint à ce mo­
ment, la tâche est simplement ignorée : cron n’essaie pas de les « rattrap­
per » au prochain démarrage de l’ordinateur. Choisissez donc des horaires
où l’ordinateur est généralement allumé, ou bien utilisez anacron, qui est
moins flexible que cron mais qui gère mieux les périodes d’extinction.

Il est illusoire d’espérer utiliser des lignes de commandes complexes dans


un crontab: le format (une tâche par ligne) les rendra dures à lire et en­
core plus dures à décortiquer si elles ne marchent pas comme prévu. Pour
des tâches un peu compliquées, il est préférable d’utiliser un script ad hoc
(voir page 137), que l’on peut tester à part, et appeler ce script depuis le
39. Dans le cas de rsync, il suffit de mettre en place des clés SSH.
40. Ce crontab dispose d’un champ supplémentaire, entre la fréquence et la commande, qui
spécifie le nom de l’utilisateur sous lequel la commande est lancée. Voir page 162 pour ouvrir
une session de super-utilisateur.
CHAPITRE 4 — GÉRER LE TEMPS ET LE RÉSEAU

crontab. Dans ce but, il peut être intéressant de définir des variables d’envi­
ronnement*! spécifiques au crontab, en rajoutant leur définition au début du
fichier*?. La variable spéciale MAILTO permet de choisir l’adresse qui recevra
les mails. Pour lancer un script personnel, on pourra redéfinir le $PATH® :
PATH=/bin:/usr/bin:/home/vf/bin | Pas besoin de « export » ici
PERLSLIB=/home/vf/lib/per1 | Pour des packages Perl personnels
MAILTO=vf@example.org Envoi du résultot à fi@exumple.ovq
10 12 * * O mes_sauvegardes Scrip+ perso dans /Kome/vf/bin

b. at: prévoir des commandes à l'avance


Tout comme cron, at permet de planifier l’exécution de commandes. Ce­
pendant, contrairement à cron, at ne les exécute qu’une unique fois, à une
date précise. On lance at en spécifiant cette date. Il répond avec une invite,
at>, dans laquelle on rentre les commandes à exécuter à raison d’une par
ligne**. On termine la liste des commandes en appuyant sur en|D*. Voici
comment sauvegarder le contenu du répertoire data dans 15 minutes (littéra­
lement now, « maintenant », plus 15 minutes) :

% at nowv + 15 minutes … Les espaces après « now » sont facuttatifs


warning: commands will be executed using /bin/sh
at> rsync -av data sauvegardes
at> <EOT*°> EbT est affiché après un appui sur el D
job 13 at Wed Jun 1 10:50:00 2011
En lieu et place de minutes, on peut utiliser days (jour) ou hours (heure).
On peut aussi spécifier une heure précise, comme suit :
% at 21:42 Ce soir à ZIhYZ, ou demain à cette keure si c’est déjà passé
On peut consulter la liste des tâches enregistrées en lançant atq”? :
% atq
13 Wed Jun 1 10:50:00 2010 a vf
14 Wed Jun 1 21:42:00 2010 a vf
Pour annuler une commande, on passe son numéro à atrnm:
% atrm 14 Supprime la tâche prévue à 21h4Y2
41. Elles contrôlent de nombreux aspects du shell et des programmes qu'’il lance, nous les
verrons plus en détail page 99.
42. On peut en fait les définir n’importe où ; une définition n’affecte que les lignes qui suivent.
43. Qui définit les répertoires dans lesquels le shell cherche les commandes, voir page 101.
44. Malheureusement, il n’y a pas de possibilité de correction des commandes : les flèches et
autres touches usuelles d’éditions ne fonctionnent pas, pas plus que la complétion automatique.
Cela dit, on peut utiliser des redirections pour préparer la liste de commande à l’avance avec
un éditeur, voir page 112.
45. On y reviendra page 92.
46. EOT est l’abréviation de end of transmission, « fin de transmission ».
47. On ne peut pas savoir quelles commandes sont planifiée, seulement leur date d’exécution.
4.5 — PLANIFICATION DE TÂCHES

at accepte des dates de formats différents. Ainsi, les deux commandes


suivantes planifient une tâche pour le 14 juillet 2011 à 22 heures :
% at 22:00 14.07.11 = Sour.wois.année
% at 10pm 07/14/11 Mois/jour/année
On peut combiner des dates absolues et relatives, comme dans :
% at 10pm 07/14/11 + 100 days 100 jours après le [4 juillet 201l
at est beaucoup moins utilisé que cron. Il présente tout de même un avan­
tage important: contrairement à ce dernier, at garde en mémoire les tâches
planifiées même si l’on éteint l’ordinateur, et exécute au démarrage les tâches
qui étaient prévues pendant que l’ordinateur était éteint.
Résumé du chapitre
» ssh permet de travailler sur une » Une commande entre guillemets
machine distante. inverses est remplacée par son
» scpet rsync travaillent aussi avec résultat juste avant l’exécution de la
des fichiers distants. ligne de commande complète.
» On utilise ftp pour se connecter à un
serveur FTPE et wget et curl pour » cronetat planifient l’exécution de
télécharger des pages Web. tâches.

4.1 Commandes croisées


Horizontalement Verticalement
1. Pour savoir combien de temps Envoyer un fichier depuis ftp
prend find sur la racine Qui m'a envoyé des mails ?
2. Ce soir à 9 heures Comme cp, mais utilise ssh
3. Pour éditer son crontab Comme FTB mais basé sur ssh
p&p5P Recevoir plusieurs fichiers depuis
ftp
90 CHAPITRE 4 — GÉRER LE TEMPS ET LE RÉSEAU

4.2 Les mots pour le dire


Pour éviter de taper SOn _1…+11 14 cacar ns plus que nécessaire en utilisant
SSH, on peut créer une paire de __ publique/..__4 au moyen de
la commande ……11…—_s-rsesrsrnrses On copie la partie Lucsesr srrr de la
clé sur la machine distante à l’aide de L_u_-_ssis-rse Si l’on a utilisé
un mot de passe pour la protéger, il faut utiliser _— pour n’avoir à
le taper qu’une fois par session.

4.1 ; .P][F|R ‘
SOLUTIONS

u| |o| s|
\ T|1[M|E| [F|I|N|D[ |/
‘s EG|
[A|T| |9|P|M
T|e

[ C|R[O[NiT|A|B| |-|E|]
P

4.2 Pour éviter de taper son mot de passe plus que nécessaire en utilisant SSH, on peut
créer une paire de clés publique/privée au moyen de la commande ssh-keygen. On
copie la partie publique de la clé sur la machine distante à l’aide de ssh-copy-id. Si
l’on a utilisé un mot de passe pour la protéger, il faut utiliser ssh-add pour n’avoir à
le taper qu’une fois par session.
Le shell à votre service
Chapitre

» Maîtriser : le shell au clavier


» Créer : des alias
Objectifs

> Configurer : les préférences du shell, les couleurs, etc.

Un des grands atouts de la ligne de commande est son côté extensible


et malléable : il est facile de construire petit à petit un environnement adapté
à ses besoins, que ce soit via l’utilisation de raccourcis clavier ou par la person­

les raccourcis.

5.1 De“Aà z
a. Raccourcis clavier courants
Les shells se pilotent via de nombreux raccourcis clavier. Nous allons vous
présenter ceux qui sont communs à tous les shells — et qui sont aussi utili­
sables avec d’autres programmes. Ils sont pour la plupart basés sur la touche

(en minuscule). S
cu
cu!, que l’on note ” en abrégé : « “A » veut dire ËÎË suivi de la touche « a »

Navigation

“Aou c! début de la ligne


Æn} — fin de la ligne
caractère suivant
caractère précédent
remonter dans l’historique (commandes plus anciennes)
descendre dans l’historique (commandes plus récentes)

Édition
/) o e) = supprime le caractère sur le curseur!
83 supprime le caractère à gauche du curseur
« coupe » le mot à gauche du curseur”
« coupe » du curseur jusqu’à la fin de la ligne*
2
« coupe » du début de la ligne jusqu’au curseur
« colle » ce qui vient d’être coupé par “K, 7W ou "U*

1. Si aucun caractère n’est présent, 7D a une autre fonction, voir page suivante.
92 CHAPITRE 5 — LE SHELL À VOTRE SERVICE

S’il peut sembler redondant d’apprendre les raccourcis en ctgg + une lettre
quand les mêmes fonctions sont accessibles par des touches plus intuitives,
ceci est tout de même une bonne idée, pour les raisons suivantes :
— Les puristes diront qu’il est plus rapide de les utiliser que les flèches
et autres, car on n’a pas besoin de déplacer les mains.
— Il arrive que les flèches refusent de fonctionner, sur un terminal distant
inhabituel, ou après un zcat intempestif sur un fichier binaire (voir en­
ont plus de
chances de fonctionner : mieux vaut avoir plus d’une corde à son arc !

À éviter !
S gèle le terminal jusqu’à l’appui sur 7Q

La touche S a pour effet de geler complètement le terminal, ce qui peut


parfois laisser penser qu’il a « planté ». Il n’en est rien ; il suffit d’appuyer sur
7Q pour lui rendre vie. Si un terminal semble vous ignorer complètement, c’est
peut-être parce que vous avez appuyé par inadvertance sur 7S. Dans le doute,
appuyer sur 7Q ne peut pas faire de mal.

Autres actions
“"Iou æ complétion automatique (page 42)
! lance la commande
“L efface l’écran
-G efface la commande en cours d’édition
“D « fin de transmission »
D signale aux programmes qui attendent une entrée de votre part (comme
at ou mail par exemple) que vous avez fini. S’il est utilisé dans le shell lorsque
la ligne est vide, le shell se termine, et le terminal se ferme (sauf dans le cas
de sessions SSH, où seul le shell distant est terminé). G peut être utilisé pour
tout annuler quand on se trompe dans l’édition d’une commande de manière
difficile à récupérer, comme un guillemet pas fermé.

b. Gestion des commandes


Le shell permet de gérer des commandes en cours d’exécution (ou encore
des « tâches ») via des raccourcis clavier° :

2. Il ne s’agit pas du couper/coller classique : celui-ci est interne au shell et ne permet pas
de dialoguer avec d’autres applications de la session graphique en cours. Utilisez la souris pour
cela, mais sachez qu’un texte sélectionné à la souris peut être collé dans un terminal avec smËâ
+ hes.
3. Ces raccourcis ne fonctionnent que si le terminal est la fenêtre active, ce qui est particuliè­
rement important si l’on a lancé un programme graphique depuis la ligne de commande.
5I1-DE“AA TZ 93
Interrompre des commandes
C _ termine définitivement la commande en cours
-Z suspend momentanément la commande en cours
Quand on utilise “Z, le shell signale que l’on a suspendu une commande
avec un message ressemblant à ceci :
% find /

[1]+ Stopped find /


[début de réponse de find ] ;A9‘5‘, +Z

% [[ est le numéro de tâche (job number en anglais).


Le shell redonne la main, et on peut lancer d’autres commandes comme
d’habitude. En outre, on peut utiliser les fonctions suivantes :
Manipulation des commandes suspendues
fg (pour foreground, premier plan) reprend l’exécution de la com­
mande suspendue à l’endroit où l’on l’avait laissée ; le shell ne
rend la main que lorsqu’elle se termine
bg (pour background, arrière-plan) reprend l’exécution de la com­
mande en tâche de fond ; le shell redonne la main immédiate­
ment
kill %1 (tuer!) termine définitivement la commande suspendue
| est le numéro de tâche, donné après appui sur aZ
disown =— empêche la commande en tâche de fond de se terminer auto­
matiquement quand le shell se finit
jobs affiche les tâches en cours pour ce shell
À l'exception de jobs, ces commandes peuvent prendre en argument le nu­
méro de la tâche ciblée ; c’est d’ailleurs une obligation pour ki11 :
k jobs Affiche les tâches en cours
[1]+ Stopped find / “âche |, arrêtée
[2]- Running emacs … Tâche 2, en arrière-plan
% fg %1 Redémarre la tâche { (find) au premier plan.
fg peut aussi ramener au premier plan une tâche qui tourne en arrière-plan.
On peut lancer directement une commande en tâche de fond en la faisant
suivre par & :
% xdvi article.dvi &
[1] 7404 | est le numéro de tâche, 7Y4O4Y le PID
Ainsi, on peut afficher « article.dvi » avec xdvi et utiliser le même ter­
minal pour lancer les commandes pour le mettre à jour (latex par exemple).
Les commandes qui tournent en arrière-plan sont terminées par le shell
au moment où l’on quitte ce dernier*. Pour l’éviter, on a deux possibilités : soit
4. C’est le cas en général, mais cela dépend de la configuration du shell.
CHAPITRE 5 — LE SHELL À VOTRE SERVICE

utiliser disown comme indiqué ci-dessus, soit lancer la commande en la faisant


précéder de nohup:
% nohup xdvi article.dvi &
[1] 10023
nohup: ignoring input and appending output to nohup.out
On peut maivctenant fermer le terminal sans risquer de fermer aussi xdvi
En plus d’empêcher le programme de se terminer prématurément, nohup redi­
rige toutes ses sorties dans le fichier nohup.out.
Est-ce que Ctrl-C et Ctrl-Z fonctionnent toujours ?
D’un point de vue technique, les programmes ont le droit d’ignorer le signal
envoyé par “C (c’est par exemple le cas de 1ess), tandis qu’ils ne peuvent
pas le faire pour 7Z. En conséquence, si un programme échappe à votre
contrôle et ne répond pas à “C, utilisez 7Z puis kill %1°.

Toutes les fonctions présentées ci-dessus ne peuvent cibler que des com­
mandes qui ont été lancées depuis le shell en question. Une exception notable
est kill, qui peut agir sur n’importe quelle commande pourvu qu’on connaisse
son « numéro de processus »°, PID en abrégé, un numéro unique qui est donné
par le système d’exploitation à chaque commande, indépendamment de la ma­
nière dont elle est lancée (shell, interface graphique, cron, etc.). On peut l’ob­
tenir en utilisant ps -e, qui liste toutes les commandes en cours” :
% ps -e
PID TTY TIME CMD
3118 ttyl 00:00:00 xterm
3120 pts/0 00:00:00 zsh
6952 ttyl 00:00:00 xterm
6954 pts/5 00:00:01 zsh
7404 pts/5 00:02:54 emacs [...]
% Kill 7404 Termine la commande emacs
On aurait pu utiliser aussi killall :
% killall emacs
qui termine toutes les commandes emacs, dont celle dont le PID est 7404.

c. Une autre approche des tâches de fond : screen


On a parfois besoin de lancer une commande en tâche de fond (un long
téléchargement avec wget, ou un calcul sur un serveur par exemple), puis
5. Si même ceci reste sans effet, ki11 -KILL %1 fonctionnera forcément, voir kil1(1) pour
plus d’informations.
6. Process number ou process identifier en anglais.
7. C’est l’équivalent de jobs pour le système entier.
5.2 — LES ALIAS 95
de se déloguer en laissant tourner la commande, et de la reprendre après. C’est
la raison d’être de screen. Quand on lance screen, il démarre un nouveau
shell, après un écran d’accueil que l’on passe en appuyant sur Envée . On peut
y lancer les commandes que l’on veut, comme d’habitude. À tout moment,
on peut appuyer sur la suite de touches ËÏ% a puis d, ce qui fait passer screen
et la commande en cours d’exécution en tâche de fond, et retourne au shell
original :
% screen
% ./mon_calcul {nvtte du shell de la session screen
[sortie de « ./mon_calcul »]
Appui sur Œ a puis d (pour « détacher »)
[detached from 17298.pts-23.machine]
h \nvite du shell inttial
Il est alors possible de fermer le terminal voire de se déloguer ; la com­
mande continue à s’exécuter sous le contrôle de screen. On peut reprendre
le contrôle de la session screen en lançant
% screen -r Pour & réattacher »
On retrouve alors le terminal tel qu’il aurait été si la commande avait continué
à y tourner.
Historique d'une session shell
Indépendamment de ces possibilités, screen sert aussi à garder une trace
d’une session shell, par exemple quand on entreprend pour la première
fois une tâche complexe que l’on souhaite automatiser, ou bien simplement
pour garder une trace de ce qu’il s’est passé (installation d’un serveur). Pour
activer cette fonction, on appuie sur ©n} Pl a puis H (le «H» doit être en
majusculeS), qui crée un fichier screenlog.0. Tout ce qui est affiché par la
suite dans le terminal (vos commandes et leurs résultats) y est enregistré”.

À l’usage, il apparaît que l’on emploie souvent les mêmes commandes, fré­
quemment avec le même jeu d’options. Pour éviter de se répéter et de passer
son temps à chercher des options dans les documentations, ou pour donner
à certaines commandes des petits noms plus faciles à retenir, il est possible
de définir des ALIAs, c’est-à-dire des raccourcis pour des commandes. On les
définit soit provisoirement en les tapant dans l’invite du shell, soit définitive­
ment en rajoutant dans le FICHIER DE CONFIGURATION DU SHELL!° des lignes
qui se présentent sous la forme :
9. Pour lire ce fichier, il peut être intéressant d’utiliser l’option -R de 1ess, qui rétablit l’affi­
chage des couleurs.
10. -/.bashrc pour bash, voir page 104 pour les autres.
CHAPITRE 5 - LE SHELL À VOTRE SERVICE

Notez les guillemets simples


alias dui=?du -h --max-depth=1i? ;3up
Pas d’espaces autour de « = » !
Cette ligne définit l’alias du1, qui peut désormais être utilisé comme une
commande, et qui est un synonyme de « du -h --max-depth=1 ». Ainsi,
% dui */
revient à lancer :
% du -h --max-depth=1 */
Pour le restant de ce chapitre, la plupart des commandes seront dépour­
vues d’invite, pour rappeler qu’on les tape en général dans un fichier de confi­
guration plutôt que directement dans le shell. Pour autant, il s’agit bien de com­
mandes comme les autres, que l’on peut aussi utiliser depuis le shell. Nous
y reviendrons page 104.
Le shell ne lit son fichier de configuration qu’à son lancement (quand le ter­
minal s’ouvre, juste avant que la première invite apparaisse). Les nouveaux

argument: '
alias ne sont donc disponibles que dans les terminaux ouverts après la modi­
fication du fichier de configuration ! Les impatients peuvent utiliser la com­
mande source, qui force le shell à relire le fichier de configuration passé en

% source -/.bashrc Recharge le fichier de cowFigwa+îou / bashre


Pour effacer définitivement un alias que l’on a défini, il suffit de supprimer
la ligne correspondante dans le fichier de configuration ; pour l’effacer tempo­
rairement, on utilise unalias suivi du nom de l’alias. Rajouter un unalias
approprié dans le fichier de configuration du shell est aussi la seule manière
de supprimer les alias définis par défaut, à moins d’avoir des droits adminis­
trateurs sur la machine pour éditer le fichier /etc/bash.bashrc!!.
Astuce : -/.alias
Il est pratique de grouper tous les alias dans un fichier unique comme
-/ .alias plutôt que de les écrire directement dans le fichier de configura­
tion du shell. Il faut alors demander à bash de lire ce fichier au démarrage
en rajoutant la ligne suivante dans -/.bashrc:

remplace*!* : ‘
type montre si une commande est un alias et, le cas échéant, ce qu’il

% type dui
dui is aliased to ‘du -h --max-depth=1?
Voici les règles à respecter pour écrire des alias :

11. Ou /etc/profile ; choisissez celui qui est déjà présent.


12. which donne le résultat attendu avec certains shells, mais pas avec bash.
5.2 — LES ALIAS 97
— Utilisez toujours des guillemets simples « ? » autour du texte de rempla­
cement'* et pas d’espaces autour du signe « =».
— Cantonnez-vous aux chiffres, aux lettres (non accentuées) et à « _ », « — »
et « . » pour les noms des alias.
— Un alias peut en contenir un autre, comme celui-ci :
alias DU=?dui */
DU est maintenant un synonyme de « du -h --max-depth=1 */ ».
— Un alias peut « remplacer » la commande correspondante, comme dans
le cas suivant :
alias tree=’tree —A”
C’est bien le « vrai » tree muni de l’option —A qui est lancé à chaque fois
que l’on utilise tree en ligne de commande.
— On peut toujours accéder depuis le shell à la « vraie » commande en la fai­
sant précéder d’un « \ » :
% \tree Lance tree sans l’option -À.
— Pour finir, alias, sans argument, affiche les alias en cours dans le shell.
Les alias ont de multiples usages, en voici les plus courants :
— Changer les options par défaut de commandes :
alias 1s=?1s --color=auto?!*
Muni de l’option --color=auto, 1s colore les noms des fichiers et réper­
toires qu’il affiche de manière différente suivant leur nature (répertoire,
lien, exécutable, différents types de fichiers…)!°. Cette option est si po­
pulaire que dans la plupart des distributions, 1s est par défaut un alias
pour 1s --color=auto.
alias grep=’grep --color=auto?
alias less=?less -i -P%f--%1b/4L>!6
— Utiliser des options bien précises pour une commande :
alias 11=?1s -1h?
alias l1rt='1s -1rt”
alias from-latin1=?iconv -f latin1?!7

13. Sauf si celui-ci doit en contenir, voir page 125 pour plus d’informations.
14. Cette option se nomme -G sous Mac OS X.
15. Nous reviendrons sur les couleurs page 107.
16. L'option -i rend la recherche insensible à la différence majuscule/minuscules, tandis que
l’option -P/f--%1b/%L affiche le nom du fichier et le numéro de ligne courante en bas du
terminal.
17. iconv est un programme pour changer le jeu de caractères d’un fichier, nous y reviendrons
page 103.
98 CHAPITRE 5 — LE SHELL À VOTRE SERVICE

— Renommer une commande :


alias office='libreoffice" bu bien ’ooffice
alias more='1ess?!8 ‘
— Parer aux fautes de frappes trop courantes :
alias emac=’emacs?
alias naon=’nano’
— Fixer une bonne fois pour toutes une série d’options optimisées pour
un usage ; par exemple, cdrecord sert à graver des CDs et accepte
de nombreuses options. Voici l’alias que j’utilise sur ma machine!° pour
graver des pistes audio :
alias graver=’cdrecord -dao speed=8 dev=/dev/cdrw
Il s’utilise ainsi :
% graver Piste*.wav Graver les pistes audio Piste*.wav
— Garder une cohérence d’un jour sur lautre ; ainsi, l’utilisation de date
présentée page 84 pour nommer des archives donne un résultat beau­
coup plus homogène avec l’alias
alias ardate=’date +%Y-%m-%d-%Hh%M? ar pour & archive »
que l’on utilise ainsi
h tar cvzf photos-‘ardate‘.tar.gz photos
— Condenser des commandes que l’on utilise souvent en série :
alias c='cd .. && 1s’ ;
&& sert à enchaîner des commandes, voir page IS
alias CD=?cd - && clear’ clear efface l’écran.
— Enfin, pour des raccourcis très spécifiques :
alias ledzep=’mplayer -/Songs/Led_Zeppelin/*.np3?
mplayer est un lecteur muttimédia en ligne de commande

Peut-on utiliser $1 dans un alias ?


On pourrait être tenté d’utiliser des paramètres positionnels (qui trouvent
leur application dans les scripts, voir page 141) pour des alias. Sachez que
ceci ne fonctionne pas : depuis le shell, les paramètres positionnels sont les
arguments qu’a reçu le shell à son lancement, c’est-à-dire rien, en général.
Quand le besoin s’en fait sentir, écrivez plutôt des scripts.
5.3 — LES VARIABLES D’'ENVIRONNEMENT

Principales variables d’environnement


USER votre identifiant (ou login)
Exemple : vf
LOGNAME synonyme de USER
le chemin absolu de votre répertoire home
HOME
Exemple : /home/vf ;
SHELL votre shell par défaut (voir page 100 pour en changer)
Exemple : /bin/bash
LS_COLORS contrôle la couleur de la sortie de 1s, voir page 107
PATH liste des répertoires contenant des programmes (voir
page 101)
Exemple : /usr/1ocal/bin:/bin:/usr/bin
EMAIL votre adresse électronique
Exemple : vincent@fourmond.org
EDITOR votre éditeur de texte favori
Exemple : emacs (ou nano, ou vimn, etc.)
LANG votre langue par défaut (voir page 102)
Exemple : fr_FR, pour le français (fr) de France (FR)
SPELL correcteur d’orthographe en ligne de commande
Exemple : ispell

fr_FR
100 CHAPITRE 5 — LE SHELL À VOTRE SERVICE

% cd $HOME/Archives _ Équivalent à cd »/Archives


On peut connaître la valeur de toutes les variables d’environnement d’un
coup en lançant env:
% env
LANG=fr_FR
USER=vf […]

variable : '
On a deux manières de modifier le contenu d’une variable d’environne­
ment, suivant que l’on souhaite une modification temporaire ou durable. On
change la valeur d’une variable seulement pour la durée d’une commande
en faisant précéder le nom de la commande de la valeur temporaire de la

% EDITOR=emacs crontab -e … lktiliser emacs pour éditer son crortab


Comme pour la définition des alias, il ne faut pas d’espaces autour du
signe « = ». EDITOR prend la valeur emacs pendant l’exécution de crontab,
et retourne ‘àsa valeur antérieure à la fin de cette commande. Pour rendre
cette modification permanente, il faut ajouter la ligne suivante dans le fichier
de configuration du shell (-/.bashrc pour bash) :
export EDITOR=emacs Choisit emacs comme éditeur par défaut
“ Si la valeur de la variable doit contenir des espaces, il est nécessaire d’uti­
liser des guillemets :
export SPELL=’aspell -d french”
Choistt pour correcteur d’orthographe aspell avec un dictionnaire français
On peut enfin construire une valeur en se basant sur la valeur précedente,
nous exploiterons cette possibilité page 101. Si on oublie « export », on ne
définit pas une variable d’environnement, mais simplement une VARIABLE. Ces
dernières ne sont pas communiquées aux commandes lancées par le shell, mais
servent à manipuler du texte ; nous y reviendrons en détail page 139.
Les noms des variables d’environnement sont systématiquement en MA­
JUSCULES ; se tromper revient à définir une nouvelle variable d’environne­
ment qui n’a pas de signification particulière pour les programmes.

a. Changer de shell
Pour essayer un autre shell, rien de plus simple : il suffit de le lancer depuis
votre shell habituel :
% zsh Essayer zsk jusqu’à un appui sur AD, ou jusqu’à ce
qu’on tape « exit »
Pour rendre cette modification permanente, modifier la variable SHELL n’a
pas l’effet attendu. Il faut utiliser chsh (pour changer de shell) :
-22. Voir page 125 pour plus de détails.
5.3 — LES VARIABLES D’ENVIRONNEMENT 101

% chsh
Mot de passe : Il faut donner son mot de passe
Chängement d’interpréteur de commandes
initial pour vf
Entrez la nouvelle valeur ou « Entrée » pour
conserver la valeur proposée
Interpréteur de commandes initial [/bin/bash] :
Une excellewte idée est de taper /bin/zsh (voir pourquoi page 160 !)
Puisque les fichiers de configuration du shell diffèrent pour chaque shell,
il est nécessaire de transposer pour le nouveau shell les modifications appor­
tées à la configuration de l’ancien (alias, variables d’environnement et autres).
L’utilisation d’un fichier commun -/.alias (voir encadré page 96) permet
de facilement partager les alias entre deux shells. Cette technique peut aussi
être appliquée pour les variables d’environnement.

b. Le PATH, ou comment le shell trouve les commandes


À l’exception des fonctions internes du shell°*, les commandes que l’on
lance depuis le shell sont des programmes, c’est-à-dire des fichiers exécutables
qui contiennent des instructions que la machine peut comprendre, soit direc­
tement dans le langage binaire du processeur, soit dans un language inter­
prété?*, À chaque commande, le shell associe un fichier ; il utilise dans ce but
la variable d’environnement PATH, qui contient une liste de répertoires dans
lesquels chercher, sépärés par des « : ».
Imaginons que PATH soit /usr/1ocal/bin:/bin:/usr/bin, une des va­
leurs les plus courantes. Si on lance la commande tree, le shell vérifie d’abord
s’il existe un fichier exécutable /usr/1ocal/bin/tree ; si c’est le cas, il l’exé­
cute, sinon, il s’intéresse successivement à /bin/tree, puis à /usr/bin/tree.
Si aucun de ces fichiers n’existe, le shell le signale par un « Command not
found®° ». Contrairement à Windows, le shell ne cherche pas de commandes
dans le répertoire courant, à moins que celui-ci ne soit ajouté dans le PATH?*.
Indépendamment de la valeur du PATH, il est possible d’exécuter n’importe
quel programme en donnant son chemin complet, comme :
% /usr/local/maple/bin/maple
% ./mon_script Exécute & mon_script » du répertoire courauct
La valeur par défaut du PATH suffit à exécuter toutes les commandes stan­
dard de la ligne de commande. Cependant, il est parfois nécessaire de le mo­
difier pour utiliser :
— Un programme installé à un emplacement non standard, par exemple
/usr/1ocal/maple/bin/maple;
23. Comme export ou type, voir page 41.
24. Comme les scripts shell, écrits dans le langage du shell, voir page 137.
25. Commande non trouvée, voir page 20.
26. On rajoute le répertoire courant dans le PATH ainsi: «export PATH=$PATH : . ».
102 CHAPITRE 5 — LE SHELL À VOTRE SERVICE

— des programmes personnels.


Il suffit de rajouter le répertoire dans lequel le programme est situé dans
le PATH, de la manière suivante :
export PATH=$PATH:/usr/10cal/maple/bin
Pour utiliser directement maple
Il ne faut absolument pas oublier la partie « $PATH: », sans quoi les ré­
pertoires par défaut du PATH n’y figurent plus, et toutes les commandes habi­
tuelles cessent de fonctionner.

5.4 La gestion des langues


De nombreux programmes de la ligne de commande sont traduits dans plu­
sieurs langues. C’est dans le fichier de configuration du shell que l’on indique
celle que l’on préfère :
export LANG=fr_FR
qui désigne le français (fr) de France“” (FR) comme langue par défaut. Bien
entendu, ceci ne fonctionne que dans la mesure où le programme est effecti­
vement traduit en français“*.
La combinaison d’une langue (fr) et d’un pays (FR) s’appelle une LOCALE.
La liste des locales prises en charge par votre système est donnée par:
. h locale -a
C
C.UTF-8
en_US
en_US.iso88591
en_US.utf8
fr_FR
fr_FR.iso88591
fr_FR.utf8 [..]
a. Les jeux de caractères
Certaines des locales ci-dessus comportent une précision supplémentaire :
.is088591” ou .utf8; c’est ce qu’on appelle le JEU DE CARACTÈRES. En effet,
si tous les ordinateurs du monde s’accordent sur la manière de représenter
les lettres non accentuées, les chiffres et les signes de ponctuation courants”,
ce n’est pas le cas pour les autres : caractères accentués, lettres grecques ou cy­
rilliques, idéogrammes asiatiques, etc. Il existe plusieurs manières pour l’ordi­
nateur de représenter ces caractères ; l’une de ces manières est un « jeu de ca­
ractères ». Quand on échange des textes entre différents ordinateurs (emails,
27. Par opposition au français de Belgique, fr_BE, ou du Québec, fr_CA, par exemple.
28. Cette traduction peut être partielle, dans certains cas.
29. On appelle aussi ce jeu de caractères latin-1.
30. Ceci forme le code ASCII.
5.4 — LA GESTION DES LANGUES 103

fichiers texte*!, noms des fichiers sur une clé USB...), il est possible d’avoir des
lettres mal représentées, comme des « é » qui deviennent « © », ou des lettres
accentuées qui manquent. Ceci est symptomatique de textes écrits dans un jeu
de caractères et lus dans un autre.
En général, il n’est pas nécessaire de changer globalement le jeu de carac­
tères : il est préférable de s’en tenir à la valeur par défaut du système, que l’on
peut connaître en lançant** :
% locale charmap
UTF-8

Cependant, on peut avoir besoin d’en changer temporairement, pour lan­


cer un terminal dans un autre jeu de caractères par exemple :
% LANG=fr_FR.iso88591 xterm Du leterm, konsole, gnome-terminal
ou pour convertir un fichier texte d’un jeu de caractères à un autre :
% iconv -f IS0-8859-1 < entree > sortie
Cette commande convertit le fichier texte entree”*, écrit dans le jeu de carac­
tères IS0-8859-1, en un fichier sortie, au jeu de caractères correspondant
à la locale en cours**. Ceci suppose de connaître le jeu de caractères du fichier
d’origine ; on peut s’aider de file:
% file entree
entree: ISO-8859 text Attention, il manque le -I !

Les jeux de caractères utilisés en France


Plusieurs jeux de caractères sont couramment utilisés en France, les prin­
cipaux étant iso88591 et utf8. Ce dernier est préférable dans la mesure
où il peut aussi représenter tous les caractères utilisés dans le monde en­
tier, alors que iso88591 est cantonné à ceux que l’on utilise en Europe
de l’ouest.
Pour iconv, latin1 est un synonyme de iso88591. Enfin, les ordina­
teurs Windows vendus en France sont souvent configurés pour utiliser en­
core un autre jeu de caractères (spécifique à Windows), noté cp1252 par
iconv, et inutilisable pour une locale sous Unix.

b. Les différents aspects d’une locale


Les effets d’une locale s’étendent au-delà du langage parlé par le shell, et
couvrent d’autres aspects des spécificités d’un pays, notamment le format des
31. En général, les textes stockés dans des formats binaires (traitement de texte) sont moins
enclins à ce genre de problèmes.
32. Si vous n’avez pas changé explicitement le jeu de caractères en utilisant LANG.
33. Les symboles < et > redirigent l’entrée/sortie d’un programme depuis/vers des fichiers en
lieu et place du terminal. Nous y reviendrons page 111.
34. Alternativement, on peut spécifier le jeu de caractères cible via l’option -t.
104 CHAPITRE 5 — LE SHELL À VOTRE SERVICE

dates®*, des adresses, des nombres®° et des montants. Il est possible de chan­
ger spécifiquement certains de ces aspects avec les variables suivantes*” :
Variables spécifiques
LC_NUMERIC =— nombres LC_MONETARY montants
LC_MESSAGES langue LC_TIME dates et heures
LC_PAPER papier par défaut
Même si LANG vaut fr_FR, on peut obtenir la date en anglais :
% LC_TIME=en_US date
Wed Nov 23 23:22:48 CET 2011
Enfin, dans des situations où LANG et/ou certaines des variables LC_ ont été
modifiées, on peut redéfinir tous les aspects d’une locale d’un coup en utilisant
LC_ALL, qui prend le pas sur toutes les autres variables :
% LC_ALL= libreoffi Lance Librebffice en anglais, quels que
k LC_ en_US libreoffice oiert LANG et les auctres LC_

5.5 Les fichiers de configuration


La configuration de la ligne de commande est stockée dans une série de fi­
chiers cachés de votre répertoire home. Nous allons décrire les plus impor­
tants:
Fichiers de configuration
/ .bashrc configuration de bash
«/.zshrc configuration de zsh
-/.tcshrc configuration de tcsh
-/.profile configuration du « shell de login »
/.dircolors couleurs dans 1s, tree, 1£tp...

a. Le fichier de configuration du shell


38
Le fichier de configuration du shell est un scRIPT””, c’est-à-dire une liste de
commandes exécutées au démarrage du shell. On s’en sert surtout pour mettre
en place la configuration du shell : alias, variables d’environnement et autres,
mais il n’y a pas de limitations sur les commandes qui peuvent y figurer.
À son démarrage, bash lit et exécute dans cet ordre /etc/bash.bashrc
(la configuration générale du système), puis -/.bashrc, votre configuration
personnelle. Les autres shells fonctionnent de manière similaires, mais lisent
d’autres fichiers (-/.zshrc pour zsh, -/ .tcshrc pour tcsh). Voici ce à quoi
pourrait ressembler un -/ . bashrc typique :
35. En revanche, le fuseau horaire n’est pas du ressort d’une locale, mais contrôlé par la
variable TZ. Essayez TZ=Australia/Melbourne date.
36. Pour le séparateur décimal et celui des milliers.
37. Il en existe encore quelques autres, reportez-vous à 1locale(1).
38. Les scripts sont des programmes dans le langage du shell, ils font l’objet du chapitre 7.
5.5 — LES FICHIERS DE CONFIGURATION 105

# Ajout de $HOME/bin dans le PATH


if [ -d $HOME/bin ]; then
export PATH=$PATH: $HOME/bin
fi
# Une invite en couleur
PS1=>\[\e [01 ; 32m\]\u\[\e [OOm\]@\h \v : ?
# Définition des couleurs pour 1s
eval ‘dircolors -/.dircolors‘
# Et son utilisation
alias 1s=?1s --color=auto?
# Les redirections n’écrasent pas les fichiers
set -C
# Lecture des alias depuis un fichier dédié
if [ -r -/.alias ]; then
source -/.alias
fi

Pourquoi mon -/.bashrc est-il déjà bien rempli ?


| À la création d’un nouveau compte d’utilisateur (y compris à l’installation
du système), le programme qui s’en charge* crée un répertoire home initial
| en y copiant le contenu de /etc/skel, dans lequel se trouvent les fichiers
I de configuration de base. Rien ne vous empêche de supprimer tout ou partie
de ce fichier, ou d’en commenter des morceaux“° pour comprendre à quoi
# ils servent.

Cet exemple s’appuie aussi sur des tests, les constructions if … then … fi.
Nous y reviendrons plus en détail page 145 ; sachez déjà qu’en l’occurrence,
ils permettent respectivement d’ajouter le répertoire $HOME/bin dans le PATH
et de lire le fichier -/.alias, mais seulement s’ils existent.

-/.bashrc ou -/.profile ?
Dans certains cas (login par SSH ou sur une console « texte » de l’ordinateur,
par exemple), le shell est lancé sous la forme d’un shell de login. Il s’agit
du même shell que d’'habitude, mais il lit des fichiers de configuration dif­
férents. Ainsi, au lieu de lire -/.bashrc, bash lit et exécute le premier des
fichiers -/.bash_profile, -/.bash_login, et -/.profile qu’il trouve.
39. Il s’agit du programme adduser ou useradd, suivant les systèmes.
40. C'est-à-dire rajouter des « # » au début des lignes en question.
106 CHAPITRE 5 — LE SHELL À VOTRE SERVICE

| Vous avez alors l’impression d’avoir perdu votre configuration*!. Deux pa­
rades : soit vous relancez directement votre shell « à la main » :
% bash

source $HOME/.bashrc

Les invites
La variable PS1 contrôle la façon dont le shell affiche les invites. En plus
des caractères habituels, on peut y utiliser les codes spéciaux suivants®** :

Séquence spéciales dans PS1


\u votre nom d’utilisateur
\w le répertoire courant, repéré depuis le répertoire home*3
\W _ le nom du répertoire courant (bin pour /usr/bin)
\h le nom de la machine
\A Pheure
\d _ la date

Voici par exemple ce que donneraient quelques valeurs de PS1 si le réper­


toire courant est -/Travail/Congres:

Différentes invites
PS1=?\A \W $ 19:22 Congres $
PS1="\u@\h -- \w %’ vf@totoro -- -/Travail/Congres %

À noter : PS1 n’est pas une variable d’environnement, juste une variable
du shell. En conséquence, export n’est pas nécessaire**. Par ailleurs, les guille­
mets simples protègent les caractères spéciaux ; nous y reviendrons page 125.

Options du shell
Certains des comportements du shell sont configurables à l’aide de la com­
mande set, qui accepte une série d’options, parmi lesquelles :

41. Dans le cas d’un shell de login, $0 commence par « - », comme « -bash », ce qui permet
de les distinguer des shells usuels.
42. Il en existe encore bien d’autres, reportez-vous à bash(1), section « Invites » pour plus
d’informations. Par ailleurs, les codes utilisés par les autres shells sont différents, même si les
principes restent les mêmes, voir page 160.
43. Les répertoires qui ne descendent pas du home sont affichés en chemin absolu.
44. Nous reviendrons sur les variables du shell page 139.
5.5 — LES FICHIERS DE CONFIGURATION 107

Options du shell
-a rend export implicite
-b notifie la fin des tâches de fond immédiatement
(plutôt qu’à l’invite qui suit)
-C refuse d’écraser des fichiers par une redirection
-f désactive complètement les globs
Options surtout utiles pour les scripts*°
-e termine un script dès qu’une commande échoue
-u affiche une erreur si l’on utilise une variable non définie
-x affiche les commandes exécutées

On inverse l’effet d’une option en remplaçant - par +. Par exemple,


h set +f
réactive les globs.
On peut aussi passer ces options directement à bash quand on le lance :
% bash -f +C
ouvre un nouveau shell où les globs sont désactivés et où les redirections
peuvent effacer des fichiers sans avertissement.

b. Voir la vie en couleur


Bien que ce livre ne puisse pas trop le mettre en avant, le shell peut faire
usage de couleurs. Par exemple, 1s, muni de l’option --color=auto®*, se base
sur la variable LS_COLORS pour colorer les noms des fichiers et répertoires
qu’il affiche. Plutôt que de modifier directement LS_COLORS, ce qui n’est pas
aisé, on modifie un fichier de configuration, -/ .dircolors, et on laisse le pro­
gramme dircolors répercuter ces modifications sur la valeur de LS_COLORS,
en intégrant la ligne suivante dans le fichier de configuration du shell :
eval ‘dircolors $HOME/.dircolors‘
Si vous n’avez pas déjà de fichier -/.dircolors, vous pouvez en créer
un de la manière suivante :
% dircolors -p > -/.dircolors
Ce fichier est composé de lignes du type :
.jpg 04;35
x- _ 42;37;01 * ne marche qu’en début de nom
La partie de gauche (. jpg et *-) définit les noms des fichiers concernés,
respectivement tous les fichiers se terminant par .jpg ou par -. La partie
45. Voir page 140.
46. Qui est activée par défaut grâce à un alias dans le .bashrc de la page 104.
108 CHAPITRE 5 — LE SHELL À VOTRE SERVICE

de droite désigne la couleur correspondante, composée de trois parties facul­


tatives (dans n’importe quel ordre) séparées par des points-virgules « ; »*7 :

Couleur du texte
30 noir 31 rouge 32 vert 33 jaune
34 bleu 35 magenta 36 cyan 37 blanc
Couleur de fond
40 noir 41 rouge 42 vert 43 jaune
44 bleu 45 magenta 46 cyan 47 blanc
Attributs
00 normal O1 gras 04 souligné
Ainsi, 04 ; 35 veut dire « magenta souligné » et 42; 37 ; 01, « fond vert, texte
blanc, gras ». Certains terminaux sont capables d’afficher plus de couleurs ;
par exemple xterm peut en afficher 256 différentes, comme 38;5;172, qui
correspond à une couleur de texte jaune foncé sans autres attributs*$. D’autres
terminaux en revanche refusent obstinément de colorer quoi que ce soit, mais
le gras et le souligné peuvent fonctionner quand même.
En plus de 1s, tree et 1ftp utilisent eux aussi LS_COLORS. Par ailleurs,
grep accepte, comme 1s, une option --color=auto pour mettre en valeur
les occurrences du texte recherché.
Pourquoi auto ?
La partie =auto de l’option demande aux programmes concernés de faire
la différence entre le cas où la commande affiche son résultat directement
dans le terminal, où la couleur est bénéfique, et le cas où la sortie est en­
voyée dans un fichier ou un autre programme*°, où les codes indiquant la
couleur sont gênants, et donc désactivés.

Enfin, signalons qu’il est aussi possible d’utiliser ces codes de couleur pour
l’invite du shell, via une syntaxe un peu plus lourde. Pour mettre une partie
en vert gras (01 ; 32), il faut la précéder de \ [\e [01 ; 32m\] et la faire suivre
de \[\e [0Om\] pour revenir à la normale :
PS1=\[\e [01;32m\] \u\[\e [00Om\] @\h \w : ”
Dans cet invite, le nom d’utilisateur (\u) est en vert gras, et le reste sans mise
en valeur particulière.

47. Pour plus d’informations, voir en.wikipedia.org/wiki/ANSI_escape_code (en an­


glais).
48. Vous pouvez vous référer à vww.frexx.de/xterm-256-notes (en anglais) pour plus d’in­
formations.
49. Nous reviendrons sur ces possibilités au chapitre suivant.
Résumé du chapitre
Le shell peut être contrôlé par des l’aide de la commande export.
raccourcis au clavier.
La locale, définie par LANG et les
"Z suspend une commande, fg et bg variables LC_, contrôle les
la reprennent, et & la lance préférences linguistiques.
directement en tâche de fond.
alias définit des raccourcis pour des
commandes. configuration ne prennent effet que
dans les terminaux lancés après le
Les variables d’environnement
changement.
contrôlent de nombreux aspects de la
ligne de commande, sont en
MAJUSCULES et se définissent à

Horizontalement Verticalement
. Idéal pour lancer une commande et a. Quel est mon email ?
la reprendre plus tard
b. Variable importante pour la
recherche des programmes à
. Mot: ce qu’il faut absolument exécuter
rajouter dans les fichiers de Version « originale » de tree
configuration pour s’y retrouver
…. Raccourci pour des commandes
. Pour lancer une commande qui ne
® Quelles sont les locales disponibles ?
meurt pas quand le shell se termine
. Terminer (brutalement !) la tâche r Lancer vi (un autre éditeur) en
suspendue anglais américain
. Début de ligne
£5
g. Le fichier de configuration de bash
110 CHAPITRE 5 - LE SHELL À VOTRE SERVICE

5.2 Les mots pour le dire


Le fichier -/._u…snu ns CONtient des LLsscsrsiseues es QUE bash exé­
cute à son démarrage. On peut y définir entre autres des ... et des

5.1 ; ,
rrrs reatsrnrs ŒO'Hoscsrsessscssesses. Les modifications portées
à ce fichier ne prennent effet que dans UN Lisisistsises carsisiss, SAUÉ si
on lance la commande _+sssises 77s escsusissess

SOLUTIONS

, —,A =. d[=7
Berçep
c| [p] |T| [A| . |N [.
H| |A| [R] [1]| [1] j6| |B

A s|
|E|X|P|O|R|T| |E[D[I1|T|O|R|=N[A[N[O|
|_| (H El A [6 E HS
E | L| | R
$ |S| |A| “[NjO|H|U|P]
s| C[O|M|M|E|N|T|A[I|R|E| |U| |C|

L “ja] |v]
[K[r[r]1]| [e]1] H
1|
5.2 Le fichier -/. bashre contient des commandes que bash exécute à son démarrage. On
peut y définir entre autres des alias et des variables d’environnement. Les modifications
portées à ce fichier ne prennent effet que dans un nouveau shell, sauf si on lance la
commande source -/.bashrc.
Les outils du sorcier
Chapitre

» Combiner des programmes


Objectifs
b Agir en masse
> Contrôler les entrées/sorties des programmes

Nous avons décrit jusqu’à présent des outils utiles et performants, sans dé­
tailler leurs interactions potentielles. Les deux derniers chapitres de ce livre
vont pallier ce manque et vous présenter ce qui fait toute la puissance de
la ligne de commande : les mille et une manières de combiner des programmes
simples en des tâches complexes, précises, et généralement difficiles à réali­
ser autrement. Nous avons passé les chapitres précédents à décrire les diffé­
rents ingrédients de la ligne de commande, c’est maintenant que vous allez
apprendre à les combiner pour créer vos propres recettes !

6.1 Rediriger les informations


Le shell permet de stocker l’entrée ou la sortie d’un programme en utilisant
Une REDIRECTION.

a. >: rediriger la sortie


Le symbole « > » redirige la sortie d’un programme dans un fichier, au lieu
de l’afficher dans 1e terminal. Ainsi,
% 1s Musique > mes_chansons.txt
crée un fichier mes_chansons.txt contenant la liste des fichiers présents
dans le répertoire Musique, et n’affiche aucun texte dans le terminal!. Cette
construction sert à stocker le résultat d’une commande sur lequel on doit tra­
vailler par la suite, ou bien pour l’envoyer à quelqu’un d’autre. On peut aussi
user de cette possibilité pour créer des petits fichiers texte :
% echo texte > mon_fichier.txt
ou transformer une commande complexe én script“ en la rappelant dans lhis­
torique et en la préfixant de echo, commeô® :

1. Sauf si 1s affiche un message d’erreur, nous y reviendrons page 113.


2. Voir page 137.
3. Il faut entourer la commande de guillemets appropriés si elle contient des caractère spé­
ciaux ou des guillemets, voir page 125.
112 CHAPITRE 6 — LES OUTILS DU SORCIER

h find -name ’+.pdf* -mtime -10 -size +2M


Pour réutiliser cette commande, on la stocke dans & script »
k echo "find -name ’*.pdf’ -mtime -10 -size +2M" > script
Suivant la configuration du shell*, si le fichier cible existe, soit la redirec­
tion > l’écrase sans confirmation, soit elle donne une erreur”, auquel cas la
commande n’est pas exécutée. Independammcnt de sa configuration, on peut
forcer le shell à écraser le fichier cible en utilisant >| en lieu et place de >6.
Î est parfois désirable d’ajouter le résultat de la commande à la fin du fi­
chier en question plutôt que d’en remplacer le contenu ; on utilise pour ceci >>.
Pour compléter le fichier mes_chansons . txt avec le contenu d’un autre réper­
toire, on pourrait ainsi lancer :
% 1s AutreMusique >> mes_chansons.txt

cat : concaténer des fichiers


| cat affiche dans le terminal tous les fichiers qui lui sont donnés en argu­
4 ment, les uns à la suite des autres. Ceci permet de concaténer des fichiers,
| c'est-à-dire de les fusionner en un seul :
% cat chapitre_+.txt > livre.txt

b. <: rediriger l'entrée


« <» est le pendant de « > » pour préparer à l’avance l’entrée d’une com­
mande. Par exemple, plutôt que de taper la liste des commandes à planifier
directement dans at, il est plus confortable de préparer à l’avance avec un édi­
teur de texte” un fichier contenant les commandes, par exemple :
tar cvzf docs-‘date +4Y-/m-%d‘.tgz docs
scp docs-‘date +4Y-%m-/d‘.tgz serveur.org:archives
et de lancer at de la manière suivante :

% at nowv + 4 hours < commandes.txt SûW&gard£ dans Ÿ heures


Un programme avec lequel il est fréquent d’utiliser ce genre de redirec­
tions est mail, qui permet comme son nom l’indique d’envoyer des courriers
électroniques :
k mail -s ’Bonjour !’ h-k@example.com < message.txt
4. Voir set -C page 107 pour changer le comportement par défaut de votre shell.
5. bash: mon_fichier.txt : impossible d’écraser le fichier existant.
6. Vous pouvez aussi utiliser rm pour enlever la cible au préalable.
7. Il existe une redirection <<, nommée here document (littéralement document ici), qui per­
met de profiter des facilités d’édition du shell pour préparer l’entrée d’une commande — une
sorte d'intermédiaire entre l’entrée directe et l’utilisation d’un éditeur.
6.1 — REDIRIGER LES INFORMATIONS 113

envoie un mail à h-k@example .com de sujet « Bonjour ! » et dont le contenu


est celui du fichier message . txt®.
Position des redirections
La position des redirections dans la ligne de commande est complètement
arbitraire ; ainsi, ces commandes sont équivalentes :

c. Les deux flux de sortie


Commençons par une petite expérience, en supposant que l’on n’a pas la
permission de lecture sur le répertoire Musique :
h 1s Musique > mes_chansons.txt
1s: impossible d’ouvrir le répertoire Musique:
Permission non accordée
Ah. Toute la sortie n’a donc pas été redirigée vers mes_chansons .txt,
puisque du texte s’affiche quand même dans le terminal… C’est qu’en réalité,
tout programme dispose de deux sorties indépendantes :
— la sortie « standard » (standard output, ou encore stdout), numérotée 1,
° où est envoyé le texte que le programme produit habituellement ;
— la sortie « erreur » (standard error, ou stderr), numérotée 2, qui sert
à afficher les messages d’erreur.

La construction > ne redirige que la sortie standard. Elle n’affecte pas la sor­
tie erreur, qui s’affiche dans le terminal comme d’habitude.
L’unique entrée, numérotée O, se nomme quand à elle « entrée standard »
(standard input, ou stdin).
On peut rediriger indépendamment les deux sorties :

Redirections
2> erreurs redirige la sortie erreur vers le fichier erreurs ;
Pas d’espace ewtre Z et> 1a sortie standard reste dans le terminal
2>> erreurs redirige la sortie erreur à la fin du fichier
erreurs
> normal 2> erreurs redirige la sortie standard dans normal et la
sortie erreur dans erreurs
&> tout redirige les deux sorties dans tout
> tout 2>&1 redirige les deux sorties dans tout

- 8 Il doit s’agir d’un simple fichier texte.


114 CHAPITRE 6 — LES OUTILS DU SORCIER

Pour envoyer les deux sorties au même endroit, il y a deux possibilités® :


soit on utilise directement &> tout, soit on redirige d’abord la sortie standard
(> tout) et on envoie ensuite la sortie erreur au même endroit (2>&1). Cette
seconde possibilité est aussi utilisable avec les pipes!°
/dev/nul1: un gouffre sans fond
/dev/nu11 est un fichier particulier présent sur toutes les machines Unix
qui se comporte comme un « gouffre sans fond » : tout ce qui y rentre est
perdu, et rien n’en sort. On s’en sert pour se débarrasser de tout ou partie
de la sortie** :
% xdvi document.dvi > /dev/nu11 2>81 &
Lance xdvi en tâche de fond sans polluer le terminal avec ses messages.

Voyons maintenant les constructions du shell pour enchaîner plusieurs pro­


grammes.

ä. « ; »: juxtaposer des commandes


Souvent, pour produire un document final à partir d’un fichier « source »
(celui que l’on modifie), il faut enchaîner toute une série de programmes. Par
exemple, pour produire un fichier PostScript article.ps à partir de son fi­
chier source en IATEX article.tex, il faut lancer les commandes suivantes :
% latex article.tex Produit le fichier article.dvi
% dvips article.dvi -o — Produit le fichier article.ps
lÂTEX
ATEX est un système très puissant de production de documents, qui est aux
traitements de textes usuels ce que la ligne de commande est aux interfaces
graphiques. On écrit dans un fichier le texte du document assorti de com­
mandes en décrivant la structure et l’apparence ; on obtient un document
PostScript en utilisant successivement latex (qui produit un fichier .dvi)
puis dvips (qui convertit le .dvi en .ps). Pour plus d’informations, vous
pouvez consulter l’ouvrage ATEX pour l’impatient dans la même collection.

Il est généralement plus confortable de grouper ces commandes sur une


seule ligne, en particulier parce qu’il suffit alors d’appuyer sur * é
pour relancer la production du document final. On utilise « ; » dans ce but :
9. Sil’on utilise > s1 2> s1, on obtient soit l’une, soit l’autre des deux sorties, de manière
imprédictible, et jamais les deux d’un coup.
10. Qui redirigent la sortie standard vers un programme, voir page 115; par exemple, on
pourra parcourir l’intégralité de la sortie de 1atex rapport.tex avec less de la manière
suivante: «latex rapport.tex 2>&1 | less».
11. On peut aussi l’employer pour se passer d’entrée, mais cela sert peu en pratique.
6.2 — ENFILER DES PROGRAMMES COMME DES PERLES 115

% latex article.tex; dvips article.dvi -o


Cette approche présente un inconvénient: dvips est lancé systématique­
ment, même dans les cas où latex a échoué — ceci fait perdre du temps,
et peut éventuellement détruire la dernière version viable de article.ps
avant l’arrivée d’un problème inopiné.

b. && et ||: enchaîner des commandes sous conditions


On évite ce travers en remplaçant « ; » par « && » qui indique au shell qu’il
ne faut lancer la deuxième commande que si la première s’est correctement
déroulée :
% latex article.tex && dvips article.dvi -o
« && » est en général préférable à « ; » car très souvent les commandes que
l’on enchaîne dépendent l’une de lautre.
À l’opposé de « && », « | | »!? n’exécute la commande à sa droite que si celle
à sa gauche a échoué :
% cd dir || echo Impossible de rentrer dans dir
echo n’est exécurté que s’il n’est pas possible d’aller dans dir
En pratique, cette construction est très peu utilisée en ligne de commande :
c’est dans les scripts (chapitre suivant), qu’elle montre tout son intérêt.
2 Et les redirections ?
Quand plusieurs commandes sont enchaînées à l’aide de « ; », « && » ou
« | | », les redirections ne s’appliquent qu’à la commande qui les précède :
h latex article.tex; dvips article.dvi -o & /dev/null

c. | : faire dialoguer des programmes


La barre verticale unique « | », qu’il ne faut pas confondre avec « | | », intro­
duit la construction la plus puissante de la ligne de commande : les « tuyaux »
(pipes en anglais, prononcer « paille-pe »), qui permettent de faire dialoguer
deux commandes en connectant la sortie de la première (celle à gauche de
« | ») à l’entrée de la seconde (celle de droite). C’est sans conteste la construc­
tion la plus mystérieuse de la ligne de commande, mais sa puissance justifierait
à elle seule que l’on s’y intéresse.
Commençons par un exemple : il arrive que des commandes fournissent
des sorties tellement longues que l’on aimerait les parcourir au moyen de 1ess.
On peut passer par un fichier temporaire :
% find -name ’*.jpeg’ > tmp && less tmp
12. && et | | correspondent respectivement au ET et au OÙ logiques.
116 CHAPITRE 6 — LES OUTILS DU SORCIER

mais cette solution pose deux problèmes : d’une part, elle ne fonctionne pas
toujours, si l’on a pas le droit d’écrire dans le répertoire courant par exemple ;
d’autre part, elle génère un fichier temporaire qu’il ne faut pas oublier d’effacer.
Une solution plus compacte et plus élégante est la suivante :
% find -name ’*.jpeg’ | less Lire la sorte de find avec less
Cette construction envoie la sortie standard (numéro 1) de find vers l’entrée
standard de 1ess, Ceci donne le résultat voulu car 1ess est programmé pour
travailler sur son entrée standard s’il est appelé sans arguments ; c’est le cas
d’autres programmes, nous y reviendrons page 116.
Les pipes offrent des possibilités insoupçonnables à première vue ; en vérité,
bon nombre d’utilitaires standard de la ligne de commande ont été conçus
pour fonctionner avec eux. Nous allons leur consacrer une part importante
de la fin de ce chapitre.
Voyons d’abord comment on peut utiliser des pipes pour pallier le manque
de 1zless qui avait été constaté page 60 : en réalité, il s’agit simplement d’uti­
liser la sortie de 1zcat comme entrée de 1ess, ce qui se traduit par:
% 1zcat fichier.1zma | less

ggp
Les pipes remplacent avantageusement les redirections < en rendant les
commandes plus faciles à lire ; les deux commandes suivantes sont fonction­
nellement équivalentes"* :
h mail -s ’Message? hk@example.com < message.txt
“h cat message.txt | mail -s ’Message’ hk@example. com

6.3 Filtrer les informations


a. Un filtre ?
On a souvent besoin de transformer le résultat d’une commande, pour
le réorganiser, en supprimer des parties, etc. On utilise dans ce but des FILTRES,
c’est-à-dire des programmes capables de travailler sur leur entrée standard.
Ces filtres peuvent s’enchaîner les uns aux autres, via l’utilisation de plusieurs
pipes, un peu comme lorsqu’on ajoute des effets en série pour créer des vidéos.
Nous avons déjà vu des programmes qui peuvent s’utiliser de cette manière.
Dans les cas les plus simples, pour grep, strings et wc par exemple, ces
programmes travaillent par défaut sur leur entrée standard si aucun fichier
n’est donné en argument. On peut ainsi utiliser grep pour restreindre la sortie
de 1ocate à des fichiers personnels :
h locate .jpeg | grep /home/vf
grep ne retient que les résultats de 1ocate qui contiennent /home/v£!*,
13. Toutefois, l’utilisation de cat sollicite légèrement plus le processeur,
14. On aurait pu utiliser aussi grep ”/home/vf, pour se restreindre aux résultats qui com-.
mencent par /home/v£, voir page 127 pourquoi.
6.3 — FILTRER LES INFORMATIONS 117

À vous de jouer !
Comment compter les fichiers retournés par la commande ci-dessus ?
T- 4 | FA/eu07/ de.

b. Les filtres les plus courants


Nous allons maintenant voir une série de programmes qui s’utilisent aussi
bien en tant que filtres que directement sur des fichiers. La combinaison de ces
filtres permet de réaliser des opérations complexes.
nl : numéroter les lignes
ni (number lines, « numéroter les lignes ») numérote les lignes de son en­
trée standard ou des fichiers passés en argument :
% n1 rapport.tex | grep donc
131 il faut donc continuer Une occurrence trouvée ligne [3
[..]
À noter : l’option -n de cat produit le même effet, et grep muni de l’option
-n affiche directement le numéro de ligne.
head et tail : le début et la fin
Les programmes head (« tête ») et tail (« queue ») affichent respective­
ment les premières et dernières lignes de leur entrée standard (10 lignes par
défaut) ; par exemple, pour afficher les en-têtes des 10 derniers courriers élec­
troniques locaux :

% from | tail
On régle le nombre de lignes affichées grâce à l’option -n!* :

Affiche les lignes


head -n3 … les trois premières
tail -n3 — les trois dernières
head -n-3 tout sauf les trois dernières 16
tail -n+3 toutes à partir de la troisième

tail permet aussi de suivre l’évolution d’un fichier au cours du temps


via son option —f, ce qui est pratique pour regarder le contenu d’un journal
du système. Ainsi,
% tail -f /var/1og/apache/access.log
/var/log/apache/access.log est le journal des accès du serveur Web Apache
a un effet analogue à
k watch tail /var/1og/apache/access.log
15. On peut se passer du n pour les nombres positifs : head -3 est équivalent à head -n3.
16. Cette syntaxe ne fonctionne pas avec la version de head présente dans Mac OS X.
118 CHAPITRE 6 — LES OUTILS DU SORCIER

sort: trier
La commande sort (« trier ») trie les lignes de son entrée standard par
ordre alphabétique. On s’en sert typiquement pour remettre dans l’ordre les
résultats d’autres commandes pour s’y retrouver plus facilement :
% apt-cache search video | sort | less
Puisque cette commande trie dans l’ordre du dictionnaire, elle donne des
résultats surprenants avec des nombres : ainsi 19 se range entre 1 et 2. On dis­
pose de plusieurs options pour contrôler le tri :

Options de tri de sort


-—n trie correctement les nombres : 1 < 2 < 10
-h trie-correctement le résultat de du -h: 30 < 2k < 3G!7
—i ignore la casse des caractères
-r trie dans l’ordre décroissant (alphabétique)
-n -r trie dans l’ordre décroissant (numérique)

tac et shuf : injecter du désordre

cut : couper les lignes en morceaux


cut (« couper ») découpe les lignes de son entrée standard en « champs »
délimités par un caractère donné ; il n’affiche sur sa sortie standard que les
champs sélectionnés!®
Utilisons cut pour extraire des informations du fichier /etc/passwd, la
base de données des utilisateurs de la machine!°. Chacune des lignes de ce fi­
chier est composée de champs séparés par des deux-points : le premier est son
identifiant, le 6° son répertoire home, le 7° son shell par défaut, etc :
root:x:0:0:root:/root:/bin/bash
On choisit les champs à afficher avec l’option -f de cut, et -d introduit le
délimiteur, qui est forcément un caractère unique”°. Ainsi, pour obtenir la liste
des utilisateurs de la machine”!, on peut lancer :
17. Cette option n’est pas disponible sous Mac OS X.
18. Dans un autre mode d’utilisation déclenché par l’option -c au lieu de -f, cut permet aussi
de sélectionner les caractères à garder, comme « les trois premiers caractères de chaque ligne ».
Ce mode est beaucoup moins utile.
19. Ce fichier tient son nom (password, « mot de passe ») du fait qu’il contenait autrefois le
mot de passe (chiffré) de chaque utilisateur. Ceci n’est plus le cas, pour des raisons de sécurité.
20. Il s’agit par défaut des tabulations.
21. La myriade d’utilisateurs que vous trouverez de cette manière ne signifie pas que votre
machine a été piratée : ils s’agit d’utilisateurs virtuels dédiés à des tâches spécifiques (serveur
de mail, d’impression, serveur Web, etc.).
6.3 — FILTRER LES INFORMATIONS 119

h cat /etc/passwd | cut -d : -f 1 Le preyier (-+1) des champs


root
daemon
délimités par'des « : » (-d :)
man
v£ [.….]

-f 1,4 affiche les premier et quatrième champs, tandis que -f£ 2-7 affiche
22.
tous ceux du second au septième““ :
% cat /etc/passwd | cut -d: -f1-3,7 Champs |, 2, 3 et 7
root:x:0:/bin/bash On peut omettre les espaces
daonon:x:1:/bin/5h entre-det-Fetlewrs
man:x:0: 1n/S W9MW\QWŸS
vf:x:1000:/usr/bin/zsh

‘uniq: supprimer les lignes en double


L’outil uniq supprime les lignes consécutives identiques pour n’en laisser
qu’une seule. I s’utilise en combinaison avec sort quand son entrée n’est
pas triée. Son principal usage est de permettre de compter les occurrences
successives, via son option -c. Nous allons l’employer pour se faire une idée
du nombre d’occurrences du mot « donc » dans une série de documents :
% grep donc *.tex
chapitre2.tex:reflète son format, et donc son type.
chapitre2.tex:donc de manière équivalente utiliser
chapitre3.tex:l1a fois; n’utilisez donc pas de globs !
chapitre3.tex:ces programmes peuvent donc tirer parti des
On utilise cut pour ne garder que la partie « nom de fichier » :
% grep donc *.tex | cut -d: -f1
chapitre2.tex
p1 Le nom du fichier est le premier des
chapitre3.tex ps Sép P °
chapitre2.tex champs séparés. par des & : %
chapitre3.tex
On supprime les occurrences en trop à l’aide de uniq” :
% grep donc *.tex | cut -d: -f1 | uniq
chapitre2.tex
chapitre3.tex
On les compte enfin grâce à son option -c 24 ,

22. On peut aussi utiliser -f 4- pour afficher tous les champs du quatrième ‘au dernier.
23. En l’occurrence, on aurait pu employer l’option -1 de grep pour arriver au même résultat.
24. Pour-être précis, cette commande compte le nombre de lignes contenant « donc », ce qui
peut être en-dessous du nombre de « donc » s’il y en a parfois plus d’un par ligne. On peut
pallier ce problème grâce à l’option -o de grep, sur laquelle nous reviendrons page 131.
120 CHAPITRE 6 - LES OUTIELS DU SORCIER

% grep donc *.tex | cut -d: -f1 | uniq -c


2 chapitre2.tex
2 chapitre3.tex
tee : sauver une copie
Contrairement aux autres commandes, tee se contente de copier son en­
trée vers sa sortie, sans la modifier. Son intérêt est qu’il en sauve une copie
dans le fichier donné en argument :
% find -name ’*.txt | tee textes | less
Sauvegarde le résuHtæt de find dans le fichier « tectes »
Si vous lancez une série de commandes qui s’enchaînent par des pipes
et qui ne fonctionne pas exactement comme vous voulez, vous pouvez insérer
un appel à tee entre les commandes pour inspecter une des étapes.

c. Utiliser l'entrée standard comme argument


À l’inverses des filtres que nous venons de voir, de nombreux programmes
nécessitent explicitement un fichier sur lequel travailler. Pour bon nombre
d’entre eux, l’utilisation de « - » comme fichier désigne l’entrée standard”°.
En plus des fichiers donnés en argument, tar archive aussi ceux listés dans un
fichier passé en argument de l’option -T. On peut tirer parti de cette construc­
tion pour utiliser tar directement sur le résultat de find :
% find -mmin —10 -type f | tar cvzf Archive.tar.gz -T ­
Archiver les fichiers modifiés les 10 dernières minuctes
On peut aussi combiner dvips avec ps2pdf pour produire un fichier PDF
à partir d’un fichier DVI sans créer de fichier intermédiaire” :
% dvips article.dvi -o - | ps2pdf - article.pdf
Pour d’autres programmes, comme gzip, on peut employer une option
pour indiquer que l’on travaille sur l’entrée standard :
% dvips article.dvi -o - | gzip -c > article.ps.gz
À l’exception de unzip et zipinfo, tous les programmes présentés dans
ce livre pour lesquels cela a un sens*” peuvent travailler sur leur entrée stan­
dard, soit directement, soit via « - » ou une option.
Certains programmes ne fournissent parfois pas de possibilité de travailler
sur leur entrée (ou sortie) standard, alors qu’il n’y a pas de raison technique
à cette limitation*®. On peut tout de même les forcer à le faire en leur passant
comme argument le fichier spécial /dev/stdin (ou bien /dev/stdout pour
la sortie standard ou /dev/stderr pour la sortie erreur), comme :
25. Ou la sortie standard, suivant que ce fichier est une entrée ou une sortie du programme.
26. Le fichier de sortie est l’argument de l’option -o de dvips.
27. rm ne va pas effacer son entrée standard !
28. Du point de vue du programme, l’entrée standard ne permet pas de revenir en arrière et
reprendre la lecture, ce qui est rédhibitoire pour certaines applications.
6.3 — FILTRER LES INFORMATIONS 121

% dvips doc.dvi -o /dev/stdout | ps2pdf /dev/stdin doc.pdf


Soyez avertis cependant que cela ne marchera pas à tous les coups”* !

d. Exécution massive de commandes avec xargs


La ligne de commande offre deux manières différentes de lancer un grand
nombre de commandes avec des arguments différents. La première repose
sur l’utilisation de boucles, que nous décrirons en détail au chapitre suivant
(page 150). L'autre manière est basée sur le programme xargs, qui construit
et exécute des lignes de commandes en lisant des arguments depuis son entrée
standard. Il présente deux modes de fonctionnement, suivant que l’on veut
traiter les arguments par grands groupes ou un par un.
Lancer quelques commandes avec beaucoup d'arguments
Dans ce premier mode, xargs construit et exécute le plus petit nombre
de commandes possible pour traiter tous les arguments“°. Par exemple, si
% xargs 1s -1
reçoit sur son entrée standard le texte suivant :
photo.jpeg
document .pdf
xargs exécute la commande suivante :
% 1s -1 photo.jpeg document .pdf
xargs s’utilise avec toutes les commandes qui affichent des listes de fi­
chiers, par exemple find:
% find -name ?’*.jpg’ | xargs 1s -1
La première partie de cette commande (find) dresse la liste des fichiers
.jpg du répertoire courant et de ses sous-répertoires, qu’elle passe à xargs.
Ceci a pour effet de lancer 1s -1 sur tous les fichiers trouvés par find.
xargs et les espaces
xargs ne lit pas exactement les arguments ligne par ligne, mais d’un « es­
pace » (dont les sauts de ligne) à un autre. Si le plus souvent cela revient
au même, cela pose problème dans les cas où les arguments doivent com­
porter des espaces. Dans ces cas, il faut utiliser l’option -d\\n*! :
% find -name ’*.jpg’ | xargs -d\\n 1s -1
{ Il est conseillé d’activer systématiquement cette option avec un alias :
Pas besoin de doubler & \ »
alias ’xargs-xargs -d\n’ _ entre les quillemets simples
122 CHAPITRE 6 - LES OUTILS DU SORCIER

Ce mode d’utilisation de xargs est le plus simple ; il se combine naturelle­


ment avec des commandes qui peuvent travailler sur de nombreux arguments
à la fois. Voici comment lire d’un coup tous les fichiers README du répertoire
courant et de ses sous-répertoires :
% find -name ?’*README*? | xargs cat | less
Lancer beaucoup de commandes avec un argument chacune
Le mode d’utilisation précédent n’est pas désirable dans certains cas, soit
parce que le programme que l’on souhaite exécuter ne peut travailler que sur
un seul fichier à la fois (comme ps2pdf ou convert), soit parce que l’on désire
plus de contrôle sur la manière dont les arguments sont organisés. On utilise
alors l’option -I% qui d’une part force xargs à n’utiliser qu’un seul argument
par commande et d’autre part permet de proposer un « modèle » de commande.
Ainsi, pour copier dans le répertoire -/rapport tous les fichiers plus récents
que version2.tex, on peut utiliser :
% find -newer version2.tex | xargs -I% cp % -/rapport
Pour chaque argument qu’il lit, xargs construit une ligne de commande en
remplaçant le « %°? » par l’argument. Ainsi, s’il reçoit'les fichiers annexe.tex
et figure.pdf, xargs lance successivement
k cp annexe.tex -/rapport
% cp figure.pdf -/rapport
On peut exploiter cette possibilité pour rapidement convertir tous les fi­
chiers PostScript du répertoire courant en fichiers PDF :
h 1s *.ps | xargs -I1% ps2pdf %
Toutes les occurences de % dans la commande sont remplacées par le même
argument, ce que l’on peut exploiter pour convertir, via convert, tous les
fichiers .png du répertoire courant en . jpeg:
% 1s *.png | xargs -I% convert % %-converti.jpeg
S’il reçoit image . png et figure.png comme arguments, xargs lance :
% convert image.png image.png-converti.jpeg
k convert figure.png figure.png-converti.jpeg
Cette solution manque un peu d’élégance, il est vrai, mais aboutit au résul­
tat souhaité, et il suffit d’utiliser rename** pour éliminer « .png-converti »
des noms des fichiers générés. On peut améliorer le résultat en supprimant à
l’aide de sed** l’extension des fichiers avant de les passer à xargs :
% 1s *.png | sed s/png\$// | xargs -I% convert Apng %jpeg
31. \nreprésente un saut de ligne : l’option se lit « utiliser un saut de ligne comme délimiteur ».
32. On peut choisir n’importe quoi en lieu et place de « % », mais ce dernier présente le double
avantage d’être très peu usité par ailleurs et de ne pas être un caractère spécial du shell.
33. Qui permet de renommer des fichiers selon des règles précises, voir page 133.
34. Cette commande manipule des chaînes de caractères, nous y reviendrons page 131.
6.3 — FILTRER LES INFORMATIONS 123

Reprenons l’exemple de image.png. La commande sed s/png\$// en sup­


prime « png » pour donner « image. » qui est passé à xargs. C’est ce que
xargs utilise en lieu et place de « % », ce qui donne finalement :
% convert image.png image. jpeg
Avec un peu d’'habitude, il est facile d’adapter cette manière de procéder
pour réaliser la plupart des actions que l’on souhaite appliquer sur un grand
nombre de fichiers“°.
Idée : xargs par défaut en mode « un argument »
Pour parer à toute erreur de manipulation de xargs avec les programmes
ne travaillant que sur un fichier à la fois, on peut redéfinir xargs de sorte
à travailler par défaut argument par argument :
alias ’xargs=xargs -d\n -I%?
La version originale de xargs reste accessible sous le nom de \xargs.

Le principal intérêt des filtres est qu’il est commode d’en enchaîner plu­
sieurs pour réaliser des actions complexes qu’il n’est pas aisé de réaliser autre­
ment, surtout de manière automatique. Voici quelques exemples qui illustrent
ces possibilités. Nous vous invitons à essayer chacun de ces exemples « pas
à pas », en rajoutant les pipes au fur et à mesure, ou en supprimant certaines
parties, pour bien comprendre l’effet de chaque commande.
Les 10 répertoires les plus gros (en espace disque)
Cherchons les dix sous-répertoires les plus gros du répertoire courant,
en terme d’espace disque occupé. du -s */ permet de connaître la taille
de tous les sous-répertoires. Il suffit de les trier par ordre numérique croissant
(sort —n) et de ne garder que les dix derniers (tail1l) :
% du -s */ | sort -n | tail
Les 10 répertoires les plus gros (en nombre de fichiers)
Comment faire si l’on souhaite au contraire connaître les dix répertoires
qui contiennent le plus de fichiers ? On commence par dresser la liste de tous
les fichiers du répertoire courant et de ses sous-répertoires (find . -type f).
On ne garde que la partie du nom correspondant au sous-répertoire en remar­
quant qu’il s’agit du second°° des champs séparés par des « / » (cut -d/ -f2).
On compte les occurrences successives de chaque sous-répertoire (uniq -c) ;
il ne reste plus qu’à trier et à ne garder que les dix derniers :
% find . -type f | cut -d/ -f2 | uniq -c | sort -n | tail
35. Sur un processeur multi-cœurs, on peut accélérer la conversion avec l’option -P2, qui fait
en sorte que deux commandes tournent en permanence.
36. Les résultats de find dans le répertoire courant commencent par « . / ».
124 CHAPITRE 6 — LES OUTILS DU SORCIER

À vous de jouer
Pourquoi n’est il pas nécessaire d’insérer sort entre cut et uniq ?
*SpA[SSSOONS SOUËT] sop ms soupye Juos puuop arouadau-snos un,p sronpy
saz sno1 : aoyedar red aioxedez amenuanbes asgjueur ap apgoord y “enbnaqeudre o1pro] surp sieymspz sop sed auvop ou putz !s SUPN

Copier les derniers fichiers téléchargés dans un répertoire dédié


Imaginons que vous venez de passer du temps à télécharger toute une série
de documents sur un même thème. Les fichiers que vous avez récupérés sont
dans votre répertoire de téléchargement — qui contenait déjà beaucoup de fi­
chiers — et ils n’ont en commun que d’avoir été créés récemment. Pour éviter
de les trier à la main, voici deux manières de les copier dans un répertoire plus
approprié, par exemple -/docs.
Si l’on sait que seuls les douze derniers fichiers sont intéressants, on peut
utiliser les options -tr de 1s pour trier les fichiers du répertoire de télécharge­
ment du plus ancien au plus récent. Les douze derniers fichiers sont obtenus
par tail -n12, et on utilise xargs pour effectuer la copie :
% 1s -rt | tail -n12 | xargs -I% cp % -/docs
Si au contraire on sait que les fichiers intéressants sont ceux téléchargés
au cours des vingt dernières minutes, il suffit d’utiliser find :
Y% find -mmin -20 | xargs -I% cp % -/docs
Imaginons qu’en même temps, vous avez téléchargé une série d’images de
Winnie l’ourson pour votre petit neveu, qui n’ont pas leur place dans -/docs.
S’il est possible de les effacer après coup avec rm *Winnie*, il est préférable
de ne jamais les copier en insérant grep -vi winnie (-v pour éliminer au
lieu de sélectionner, -i pour ne pas tenir compte de la casse) dans la com­
mande précédente*” :
Y find -mmin -20 | grep -vi winnie | xargs -I% cp % -/docs
Copier toutes les images du répertoire courant dans un répertoire dédié
Ceci peut paraître simple à première vue: pour copier toutes les images
JPEG du répertoire courant dans le répertoire -/images, on pourrait écrire
% cp *.jpeg -/images
Mais qu’en est-il des . jpg, . JPEG, mais aussi des .tiff, .png, et des fi­
chiers qui sont des images mais dont l’extension ne le montre pas, comme dans
les caches des navigateurs ? Fions-nous plutôt au résultat de file:
% file D8785BF5d01 |l s’agit d’une image dans le cache de Firefox
D3785BF5d01: JPEG image data, JFIF standard 1.02
Pour ne sélectionner que les images, il suffit de filtrer le résultat avec
grep image. On extrait le nom du fichier d’une ligne comme celle ci-dessus en
remarquant qu’il s’agit du premier des « champs » séparés par des deux-points :
37. Ce qui a l’avantage supplémentaire de prendre en compte aussi WINNIE, winnie etc.
6.4 — DU BON USAGE DES GUILLEMETS 125

h file * | grep image | cut —d : -f 1 |


xargs -I% cp % -/images

6.4 Du bon usage des guillemets


Nous avons déjà utilisé des guillemets à plusieurs reprises, soit pour écrire
facilement du texte avec des espaces, soit pour remplacer une commande par
son résultat. Revenons plus en détail sur la manière de les utiliser.
Guillemets
> .e? désactive tous les caractères spéciaux
m" désactive tout sauf \, !, $ et ‘
‘commande‘ = est remplacé par le résultat de commande, voir p. 84
$(commande) identique à ‘commande‘
Les guillemets simples et doubles désactivent la plupart des caractères spé­
ciaux (voir encadré page 20), ce qui évite de devoir les faire précéder par « \ »
pour les utiliser tels quels :
% find -name **.tex’
k mail -s "Un petit message 7" personne@example.com
% date "+/H heures %M et %S secondes"
Notez qu’il n’est pas possible d’entrer un guillemet simple au sein de guille­
mets simples, puisque même « \ » est désactivé. Ainsi, si l’on essaie de lancer :
% mail -s ’J\’arrive’ côpain@maison.net
le shell ne lance pas la commande, mais répond avec un autre prompt (« > »,
OU « quote> »), signe que l’on a oublié de fermer des guillemets. Dans ces
conditions, le plus simple est d’appuyer sur “C et de tout recommencer, éven­
tuellement en s’aidant de l’historique (touche f
Quels guillemets utiliser ?
Les deux guillemets « ? » et « " » se valent grosso-modo pour tous les usages.
Cependant, quand il s’agit d’entrer du texte, comme le sujet d’un message
électronique, il est préférable d’utiliser « " » car les textes contiennent sou­
vent des apostrophes (faites cependant attention à échapper « ! »). Pour les
autres utilisations : commandes, globs, « ? » est plus pratique en général.

% echo ’On peut melanger ?"’ et "’" sans problemes”


On peut melanger ?’ et " sans problemes
Les espaces et les globs qui sont générés par une commande entre guille­
mets inverses sont à nouveau interprétés par le shell ; si ce n’est pas le résultat
désiré, il faut les entourer de guillemets doubles :
126 CHAPITRE 6 - LES OUTILS DU SORCIER

% touch ‘echo a b‘ Qrée les deux fichiers « à » et « b »


% touch "‘echo a b°‘" Crée l’unique fichier & a b »

6.5 Globs et expressions régulières


Nous allons maintenant revenir sur les globs, qui permettent de travailler
sur un grand nombre de fichiers, et nous allons découvrir leurs cousines, les ex­
pressions régulières, qui manipulent du texte plutôt que des noms de fichiers.

a. Petit retour sur les globs


Les globs sont des motifs qui décrivent des noms de fichiers ; nous les avons
déjà utilisés à maintes reprises :
% cp *.txt -/textes Copie tous les fichiers finissant par « bet »
Lorsqu’un programme utilise des globs, qu’il s’agisse du shell, comme dans
la commande ci-dessus*$, ou bien de commandes spécifiques, comme dans
l’option -name de find, ce programme se charge d’identifier les fichiers dont
le nom correspond au motif (ici, les fichiers se terminant par « .txt »). En
plus de +, que l’on a déjà vu, voici d’autres éléments que l’on peut utiliser pour
construire des globs :
Motif Signification
* n’importe quelle suite de caractères (sauf
« / »), y compris rien
? n’importe quel caractère (sauf « / »)
[ar9] aouFou9
[0-71 un chiffre entre O et 7
[c-f] une lettre « entre » c et f °
Aucun de ces éléments ne peut remplacer un /. Ils peuvent être combinés
pour créer une description fine, par exemple :
Glob Signification
[ACD] # les fichiers commençant par A, C ou D
* [0-9] [0-9]+.jpeg les fichiers . jpeg dont le nom contient au
moins deux chiffres juxtaposés
??niou les fichiers dont le nom comporte exacte­
ment 6 lettres et finit par niou
Supposons que l’on ait les fichiers suivants dans un répertoire :
38. Rappelons que c’est le shell qui convertit le glob en une liste d’arguments pour cp, voir
l’encadré page 36.
39. La définition exacte de « entre c et f » varie d’une locale à une autre (voir page 102). S’il
est certain que c, d, e et £ en feront partie, il peut aussi y avoir, ou non, D, ê... Au besoin, vous
pouvez tester en utilisant 1s sur un répertoire temporaire que vous aurez peuplé de fichiers
créés avec touch.
6.5 - GLOBS ET EXPRESSIONS RÉGULIÈRES 127

% 1s
conf-Oi.txt conf-06.txt conf-11.txt cours-2.txt
conf-02.txt conf-07.txt conf-12.txt cours-3.txt
conf-08.txt conf-08.txt conf-bilan cours-4.txt
conf-04.txt conf-09.txt conferences.txt
conf-05.txt conf-10.txt cours-1.txt
Si l’on souhaite déplacer les fichiers conf-O1 .txt à conf-12.txt unique­
ment dans un autre répertoire, on peut utiliser n’importe laquelle des com­
mandes suivantes :
k mv conf-O* conf-1* repertoire
% mv conf-[01]* repertoire
k mv conf-*.txt repertoire
% nv conf-??.txt repertoire
% mv *-7?.txt repertoire
Depuis le shell, on dispose aussi d’une autre construction basée sur des
accolades pour générer des noms de fichiers. La commande
% convert image.{jpeg,png} Pas d’espace autour de la virgule !
est un raccourci pour
k convert image.jpeg image.png
Le shell construit les arguments de la commande en utilisant chacune des
valeurs spécifiées entre les accolades. Cette construction n’est pas à propre­
ment parler un glob, puisque les arguments générés ne correspondent pas
forcément à des fichiers existants (contrairement aux globs du'shell). On peut
aussi s’en servir pour générer des listes numérotées“° , de la manière suivante :
% mkdir -p 2011/{1..12} Crée 2011/1, 201l/2, etc. jusqu’à 20H/(2
% mkdir Bilans-{2008. .2012} . ;
% mkdir Bilans-20{08. .12} Les Ô inttiaux sorct conservés.
Voici par exemple comment peupler un répertoire de fichiers vides :

h touch fichier-{000..999} _ Crée 1000 fichiers vides d’un coup


Cette construction est particulièrement utile combinée à xargs, ou aux
boucles for (que nous verrons au chapitre suivant).

b. egrep: recherche avancée de texte


Les globs permettent de décrire des noms de fichiers. Les expressions régu­
lières s’apparentent aux globs, mais avec deux différences principales : d’une
part, elles ne sont pas cantonnées aux noms de fichiers, et s'emploient pour dé­
crire n’importe quelles chaînes de caractères. D’autre part, elles sont beaucoup
40. Si l'on a juste besoin d’une liste de numéros, sans qu’ils ne soient accolés à d’autres élé­
ments comme c’est le cas ici, on peut utiliser seq: seq 1 12 affiche les nombres de 1 à 12, et
seq -w 1 12 de 01 à 12.
128 CHAPITRE 6 — LES OUTILS DU SORCIER

plus expressives, mais au prix d’une plus grande complexité et d’une syntaxe
différente.
grep est le programme par excellence qui utilise des expressions régu­
lières*!. Nous en avons déjà parlé à deux reprises, selon qu’il travaille sur des
fichiers ou directement sur son entrée standard. S’il est lancé avec l’option —E
ou sous le nom egrep”*, il interprète le texte à rechercher comme une expres­
sion régulière, ce qui permet de trouver un texte que l’on connaît partiellement
ou, pour être plus précis, dont on connaît la « structure » : « une date », «un mot
commençant par un nombre de 3 chiffres ».
Constructions des expressions régulières
Tout comme les globs, les expressions régulières se construisent en assem­
blant des petits éléments ayant chacun une signification précise. Voici les prin­
cipaux éléments que l’on peut utiliser avec egrep :
Caractères
. n’importe quel unique caractère
\s un espace
\s tout sauf un espace
\w lettre ou chiffre ou _
[abc] aoubouc”
[’abc] tout sauf a ou b ou c
[1-5] un chiffre entre 1 et 5
[70-9] tout sauf un chiffre
« Multiplicateurs »
+ au moins une fois
? au plus une fois
* n’importe quel nombre de fois (y compris aucune)
{3,} au moins 3 fois
{,3} au plus 3 fois
{3,6} — entre 3et 6 fois
Positions
- début de ligne
$ fin de ligne
\< début de mot
\> fin de mot
Échappement
\. un point « . »
\+ un plus « + », etc,
41. Le re de son nom viendrait de regular expression, « expression régulière ».
42. «e» pour étendu.
43. Il n’est pas nécessaire d’échapper les caractères spéciaux comme * entre les crochets [J.
6.5 - GLOBS ET EXPRESSIONS RÉGULIÈRES 129

Pour trouver toutes les occurrences de « toutes les » dans chapitre.txt,


même si ces mots sont séparés de plusieurs espaces, on peut utiliser :
h egrep ’toutes\s+tles’ chapitre.txt
et pour ne trouver que les occurrences en début de ligne :
h egrep ’“toutes\s+les’ chapitre.txt
grep fonctionne ligne par ligne
La principale limitation de grep (et de egrep), qu’il n’est pas possible
de contourner, est qu’ils ne travaillent que ligne par ligne. Quels que soient
vos efforts, vous ne pourrez pas détecter « toutes les » s’il y a un saut de
ligne entre les deux mots.

Exemples : chercher des lignes…


egrep ’texte?’ contenant « texte »
egrep ’“texte’ commençant par « texte »
egrep ’texte$’ finissant par « texte »
egrep ? [0-9]+? contenant un ou plusieurs chiffres
egrep ? [0-9]+, [0-9]+? contenant un nombre à virgule
On peut utiliser \ comme caractère d’échappement pour faire perdre aux
. caractères spéciaux leur signification (par exemple « \. » correspond à un
point, et « \\ » à un unique « \ »). Attention, ceci s’applique aux arguments
tels qu’ils sont vus par grep: si vous n’utilisez pas de guillemets simples, il faut
systématiquement doubler les « \ ». C’est pourquoi il est préférable d’utiliser
des guillemets simples pour entrer les expressions régulières.
egrep ou grep ?
Si l’on ne spécifie ni l’option -F (qui désactive totalement les expressions
régulières, équivalent à lancer fgrep), ni l’option -E (équivalent à lancer
egrep), grep utilise des expressions régulières dont la syntaxe est obsolète.
Restreignez-vous alors à $, *, . et ”

Les « multiplicateurs » s’appliquent à l’élément qui les précède directement :


on peut grouper des éléments avec des parenthèses pour étendre l’effet du mul­
tiplicateur (comparez ab+ et (ab)+) :
Utilisation des multiplicateurs
a+ au moins une fois a
ab+ un a suivi de plusieurs b
(ab})+ plusieurs fois ab
* n’importe quoi (y compris rien)
[0-9]{4,} un nombre à au-moins 4 chiffres
130 CHAPITRE 6 — LES OUTILS DU SORCIER

Imaginons que le fichier anniversaires .txt contienne les dates des an­
niversaires de vos connaissances sous la forme jj/mm/aaaa (les lignes com­
mencent par la date). Les commandes suivantes permettent de trouver les
personnes :
% egrep ?20[0-9]{2}' anniversaires.txt …nées depuis 2000
% egrep ?”../07/? anniversaires.txt …ées en juillet
% egrep ”‘date +kd//m‘ anniversaires.txt
…dowt c’est l’anniversaire aujourd’hui

Dans les logiciels de courrier électronique, les dossiers sont généralement


de simples fichiers texte contenant les messages les uns à la suite des autres.
Pour retrouver rapidement les messages dont le sujet contient « devis », on peut
utiliser :

“ % egrep -A4 -i ’“Subject:.*devis’ courrier


Subject: Devis travaux — & courrier » est le fichier covctenant les
To: vincent@example.com … Messages
Message-Id: <E1RZ6a8-0000m3-1r@totoro.example.fr>
From: Plombier <plombier@example.be>
Date: Fri, 09 Dec 2011 20:58:08 +0100 | [...]
Loption -A4 (4 lignes de contexte après le texte) offre en principe suffisam­
ment de contexte pour obtenir l’affichage de la date et de l’auteur du message,
comme ci dessus, mais si ce n’est pas le cas vous pouvez utiliser des valeurs su­
périeures, ou obtenir l’affichage des lignes précédentes aussi avec -B3 (3 lignes
de contexte avant le texte) par exemple.
Bien sûr, cette possibilité peut sembler redondante avec la fonction de re­
cherche de votre lecteur de mail. Mais ce dernier peut-il par exemple compter
les mails trouvés en fonction de leur expéditeur, comme ici ?

% egrep -A4 -i ?’“Subject:.+*devis’ courrier |


egrep ?“From:? | sort | uniq -c
3 From: Plombier <plombier@example.be>
5 From: Maçon <macon@example.uk>
4 From: Electricien <electricien@example.fr>

“ Signalons enfin que toutes les options de grep que nous avons déjà vues
(p. 57) sont aussi utilisables avec egrep.
Recherche avancée dans l1ess
La fonction de recherche avancée de 1ess (vue page 30) utilise les mêmes
expressions régulières que egrep. Qu’utiliseriez-vous pour chercher des
lignes commençant par set, avec éventuellement des espaces avant, pour
trouver rapidement la définition de cette commande dans bash(1) ?
*« 39845\, » ‘OypIOUPAI EJ HoUE[ Mmod / pdes ToA® seudy
6.5 — GLOBS ET EXPRESSIONS RÉGULIÈRES 131

L'option -o : éliminer complètement le contexte


Muni de l’option -o, grep n’affiche que le texte qui correspond à ce que
l’on cherche, et non la ligne complète où ce texte a été trouvé**. Sans utiliser
d’expressions régulières, cette possibilité sert surtout pour compter des mots,
ici le nombre de « donc » dans un article :
h grep -i -o donc article.tex | wc
Cette option est beaucoup plus intéressante avec des expressions régu­
lières : servons-nous-en pour obtenir des statistiques sur l’utilisation de com­
mandes IXIEX dans un fichier, c’est-à-dire des mots de la forme \commande,

utiliser : ‘
où commande est composé exclusivement de lettres minuscules et majuscules.
Ainsi, pour afficher toutes les commandes I&TEX de document .tex, on peut

% egrep -o ’\\[a-zA-Z]+? document .tex


Il fauct doubler le & \ » afin qu’il perde sa signification pour grep.
\chapter
\label
\begin
\item [..]
Pour obtenir des statistiques, il suffit de compter avec sort et uniq -c:
k egrep -o ?\\[a-zA-Z]+* document.tex | sort | uniq -c
149 \begin
3 \chapter
30 \emph [..]
C. sed: manipulation de textes
sed est ce qu’on appelle un « éditeur de flux » (stream editor'en anglais,
d’où son nom): il permet de modifier (éditer) son entrée standard (ou les
fichiers passés en argument), et envoie le résultat sur la sortie standard. Son
usage le plus courant est d’effectuer des remplacements dans des textes :
h echo fichier.pdf | sed ’s/pdf$/jpg/”
fichier.jpg

9pP
L’argument de sed, ?s/pdf$/jpg/" se lit « remplacer (s, pour substitu­
tion) pdf en fin de chaîne par jpg ». Pour simplement supprimer le texte
en question, il suffit de préciser un texte vide comme remplacement”° :
Ÿ base=‘fichier.pdf | sed ?s/\.paf$//"‘
% echo $base Ôn stocke le nom de base du.
fichier fichier dans la variable base
44. S’il y a deux occurrences sur une ligne dans l’entrée, grep affiche deux lignes en sortie,
une pour chaque occurrence.
45. Dans ce cas particulier, on peut aussi utiliser basename fichier.pdf .pdf pour suppri­
mer l’extension de fichier .pdf, voir page 143.
132 CHAPITRE 6 - LES OUTILS DU SORCIER

C’est ce que nous avons utilisé page 122 pour supprimer l’extension des images
à convertir avec xargs convert.
s ne s’applique qu’à la première occurrence de chaque ligne, sauf si l’on
place g (pour « globalement ») après le / final :
% echo binaire | sed ?s/i/M/? Premier «i » seulement
bMnaire
% echo binaire | sed ?s/i/M/g’ Tous les & i »
bMnaMre

Tout comme grep, sed travaille par défaut avec une syntaxe obsolète d’ex­
pressions régulières“® ; il faut l’option -r“7 pour utiliser les mêmes expressions
régulières que celles de egrep. Pour supprimer tous les chiffres de l’entrée,
on peut par exemple écrire :
% sed -r ?s/[0-9]+//g
On peut aussi s’en servir pour « nettoyer » les espaces en trop, c’est-à-dire
ne garder qu’un seul espace d’une série d’espaces consécutifs :
4 sed -r *s/\s+/ /8 Ne pas«/»
oublier l’espace erctre les deux derniers
Cette commande se lit « remplacer toutes les séquences d’un espace ou
plus par un unique espace ».
Par défaut, sed est sensible à la casse des caractères, mais on peut rajouter
le « modificateur » i à la fin de l’instruction pour l’y rendre insensible :
% sed ’s/jpg/paf/i> Remplace jpg, mais aussi Jpg, SPE etc…
Par contre, le texte de remplacement est toujours inséré tel quel (ici en minus­
cules).
Enfin, sed peut enregistrer une partie du texte qu’il a trouvé pour la copier
dans le texte de remplacement. On entoure pour cela de parenthèses la por­
tion que l’on souhaite réutiliser, et on emploie \1 dans le texte de rempla­
cement pour la représenter. Par exemple, il est courant d’entourer de * les
mots que l’on souhaite mettre en *valeur* dans des mails ; si l’on souhaite
convertir en HTML un texte suivant cette convention, en mettant ces textes
en <b>gras</b>, on pourrait utiliser :
% sed -r ?s/\*([7*]+)\#/<b>\1<\/b>/g?
Il faut échapper le / dans le texte de ”
remplacement pour éviter de terminer
prématurément l’instruction
Soit : « remplacer les fragments de texte composés de deux * entourant du
texte n’en contenant pas (\*([-*]+)\x*) par le même texte entouré de <b>
et</b> (<b>\1<\/b>).» sed accepte n’importe quel délimiteur en lieu et place
de /, ce qui permet d’alléger l’écriture de la commande précédente :
46. Voir encadré page 129.
47. Sous Mac OS X, il faut utiliser l’option -E.
48. Notez qu’il est nécessaire d’échapper les * lorsqu’ils ne sont pas entre crochets.
6.5 — GLOBS ET EXPRESSIONS RÉGULIÈRES 133

% sed -r ?s#\*([7*]+)\x#<b>\1</b>#g
Plus besoin d’échapper le « \ »
On peut utiliser plusieurs fois des parenthèses pour « capturer »*° du texte ;
les remplacements correspondants sont numérotés de gauche à droite. Par
exemple, pour changer des dates du format 16-05-2011 (jour-mois-année)
au format 2011/05/16 (année/mois/jour), on peut utiliser :
% sed -r ?s#([0-9]+)-C[0-9]+)-([0-9]+)#\3/\2/\1#g
Astuce : remplacement dans les fichiers
L’option -i .bak de sed permet d’effectuer les remplacements directe­
ment dans des fichiers ; le .bak indique à sed qu’il doit laisser une co­
pie du fichier original avec le suffixe .bak®°. Par exemple, pour effectuer
la conversion des * mentionnée ci-dessus sur tous les fichiers .txt du ré­
pertoire, on peut utiliser :
h sed -i.bak -r ?s#\*([7#*]+)\x#<b>\1</b>#g? *.txt

Les fonctionnalités de sed ne se limitent pas au remplacement de texte ;


on peut en fait modifier de manière conséquente toute son entrée (dupliquer
des lignes, supprimer une région, n’effectuer de substitution qu’entre deux
lignes bien définies…). Cela dit, si vous avez besoin de telles fonctionnalités,
nous vous conseillons d’utiliser un langage plus complet, comme Perl.

d. rename : renommage en masse de fichiers


rename”! (« renommer ») permet de renommer (ou déplacer) des fichiers :
pour chaque fichier donné en argument, il construit le nom du fichier cible à
partir du nom du fichier source grâce à la règle donnée en premier argument.
On peut le voir comme une combinaison de mv et de sed. Par exemple,
h rename ’s/image/Figure/g’ image*
remplace image par Figure dans le nom de tous les fichiers commençant
par image dans le répertoire courant. Le premier argument de rename est
essentiellement interprété comme le ferait sed -r ; on peut donc utiliser des
expressions régulières :
% rename ’s/image-([0-9]+)/$1-image/? *
$l est l’équivalert pour rename du \l de sed.

49. Il s’agit du terme consacré, capture en anglais.


50. On peut bien sûr utiliser un autre suffixe que .bak, comme -i .old.
51. Ce script n’est pas disponible sous Mac OS X. Vous pouvez le télécharger à l’adresse :
digitalcardboard.com/blog/wp-content/uploads/2009/09/rename, le placer dans un
répertoire de votre PATH et le rendre exécutable.
134 CHAPITRE 6 - LES OUTILS DU SORCIER

qui permet de permuter image- et le nombre qui le suit dans les noms des
fichiers du répertoire courant.
Muni de l’option -n, rename se contente d’afficher ce qu’il ferait plutôt que
de renommer effectivement :
% rename -n ’s/image-([0-9]+)/$1-image/? *
image-00.jpg renamed as 00-image. jpg
image-01.jpg renamed as Oi-image. jpg
Il est hautement conseillé de lancer rename une fois avec -n avant de le lancer
sans -n quand on utilise des expressions régulières compliquées, car récupérer
des effets d’un rename mal écrit lancé sur un grand nombre de fichiers peut
être particulièrement pénible.
Aller plus loin avec les expressions régulières
Les expressions régulières sont des constructions très puissantes, mais pas
forcément faciles à maîtriser. Pour en tirer parti au mieux, nous vous re­
commandons la lecture du livre Les expressions régulières par l’exemple chez
le même éditeur.

Contrairement aux apparences, rename n’utilise pas les mêmes expressions


régulières que sed, mais celles du langage de programmation Perl, qui sont ré­
putées pour leur puissance et leur expressivité : celles-ci comportent de nom­
breuses extensions par rapport à ce que l’on a décrit page 128. S’il n’est pas
possible de les détailler toutes ici, voici quelques exemples à utiliser tels quels :
% rename ?s/(.*)/1c $1/eg? * Convertit en minuscules
% rename ?s/(.*)/uc $1/eg> * Convertit en majuscules
% rename ?s/(\d+)/sprintf "%04d", $1/eg’
Cette dernière commande formate tous les nombres de sorte qu’ils com­
portent au moins 4 chiffres, en les faisant précéder de O au besoin. Ainsi,
image-1.jpg devient image-0001.jpg, et ainsi de suite. Ceci permet de ré­
concilier l’ordre alphabétique et l’ordre numérique (sans cela, 1s classe le fi­
chier image-10. jpg entre image-1.jpg et image-2. jpg).
Résumé du chapitre
» Chaque programme dispose d’une » xargs construit des lignes de
entrée standard, d’une sortie commandes à partir de son entrée.
standard et d’une sortie erreur.
» egrep travaille avec des expressions
» On peut rediriger ces entrées/sorties régulières.
QEN
au moyen de > et <.
» « | » connecte la sortie standard d’un » rename peut renommer en masse une
programme à l’entrée d’un autre. série de fichiers.
6.5 — GLOBS ET EXPRESSIONS RÉGULIÈRES 135

6.1 Compléter
Comment obtenir le texte de la colonne de gauche avec les différentes ma­
nières d’échapper des caractères spéciaux ?
Texte voulu Guillemets: sans ….simples ..doubles
*gras* \*gras\* ’xgras*’ — "*gras*"
le biniou
$money$
c’est
parti !
6.2 Commandes croisées
Horizontalement Verticalement
1. Compter les lignes identiques pas a. Remplacer a par b partout
forcément consécutives b. Trouver les lignes commençant
2. Ne garder que le début par t
3. Motifs pour décrire des noms de c. Ne garder que la fin
fichiers d. Envoyer des messages électroniques
4. Permettent la communication entre e. a, Ou b si a échoue ?
deux programmes f. Numéroter les lignes

a c h
5. « Gouffre sans fond » g. Pour renommer massivement des

! [1 | £8
6. Entrée standard (pour programmes fichiers
récalcitrants) h. Découper des lignes en champs

J}} »3 __f __
: [1 110

6.3 Les mots pour le dire


Chaque programme dispose de deux _4…sss s, NUMérotées 1 et 2, et
d’Une __vsrsess (NUMérotée 0). On peut L…nscsesrsu nn l’entrée en
136 CHAPITRE 6 — LES OUTILS DU SORCIER

utilisant … et lA _uuscscsusus eN Utilisant >. On peut aussi connecter directe­


ment l’entrée et la sortie Lusrssesinns de deux programmes en utilisant
des …… Les programmes qui peuvent fonctionner ainsi se nomment
des l_J'_II_II_II_;I_ILJ.

6.1
Texte voulu Guillemets: sans … ..simples …doubles
*gras* \*gras\* **oras*? "xgras+*"
le biniou le\ biniou ’le biniou’ ‘"le biniou"
$fmoney$ \$money\$ ’$money$? "\$money\$"
c’est c\’est *c’\’’est’ "c’est"
parti ! parti\ \! ’parti !” "parti \!"
6.2
acEh £ -E
AR|
E A| [ A U
1S |O|R|T| |1{ [U/N|1|Q| |-JC
[H]JeJA[p} 311] [ | M T
s[a[L|o[B|s|, E
«|P|1|P|E|S| |R N
s| /|p|e|v[/[N[u[L|L
Al \P| à
/} |M
-eL B} |”| [A
s|/|D|E|V|/|s|T D[I|N

6.3 Chaque programme dispose de deux sorties, numérotées 1 et 2, et d’une entrée (nu­
mérotée 0). On peut rediriger l’entrée en utilisant < et la sortie en utilisant >. On
peut aussi connecter directement l’entrée et la sortie standard de deux programmes
en utilisant des pipes. Les programmes qui peuvent fonctionner ainsi se nomment des
filtres.
Lire et écrire
des programmes
Chapitre

> Automatiser toutes vos tâches répétitives


Objectifs
> Comprendre les scripts écrits par d’autres personnes
> Maîtriser l’utilisation des variables
» Et surtout: ne plus oublier de fêter les anniversaires !

En plus de son utilisation pratique au quotidien, le shell cache en son


sein un véritable langage de programmation qui vous permettra d’écrire des
SCRIPTS, C’est-à-dire des petits programmes. Ces scripts augmenteront notable­
ment votre efficacité et le confort d’utilisation de votre ordinateur en automa­
tisant la plupart de vos tâches répétitives.
Pour illustrer les concepts présentés dans ce chapitre, nous construirons
pas à pas un script, latex2pdf, qui gagnera en généralité et s’enrichira de
fonctionnalités au fur et à mesure de l’avancée dans le chapitre.

7.1 Écrire un programme


Un programme « en shell », ou « script shell », ou seulement « script », est
un simple fichier texte (que l’on crée avec n’importe quel éditeur de texte
comme emacs, nano ou gedit), qui contient des commandes, à raison d’une
par ligne :

latex doc.tex && \ Notez l’absence de prompt : ceci n’est


dvips doc.dvi -o && \ pas tapé depuis le shell, mais dans un
ps2pdf doc.ps éditeur de texte.
Lorsque les lignes sont trop longues, ou, comme c’est le cas ici, lorsque
cela facilite la lecture, on peut séparer une commande en plusieurs lignes
se finissant par des « \ »!. Ce script complète l’exemple de la page 114 pour
réaliser la compilation en trois étapes du document KTEX doc.tex en un fi­
chier PDE Les scripts évolués naissent souvent de scripts spécifiques comme
celui-ci ; nous verrons dans ce chapitre comment étendre leurs fonctionnalités
pour gagner en généralité et offrir plus de flexibilité.
On exécute ce script, que l’on nomme latex2pdf (même s’il ne mérite pas
encore ce nom), de la façon suivante :
% sh latex2pdf ; le chemin si latexZpdf n’est pas
Il faut donner
K XCDCT dans le répertoire courawt
1. Pour que ceci fonctionne, il faut que \ soit le dernier caractère sur la ligne.
138 CHAPITRE 7 — LIRE ET ÉCRIRE DES PROGRAMMES

On utilise le plus souvent le shell /bin/sh (qui est en général un lien


symbolique vers /bin/bash) pour intepréter les scripts, car des programmes
qui fonctionnent avec lui ont plus de chances de marcher sur un autre ordi­
nateur. Cela dit, rien n’empêche d’utiliser un autre shell comme bash ou zsh,
si l’on a besoin de fonctionnalités spécifiques à ces derniers. Pour se passer
de l’invocation explicite du shell et utiliser 1atex2pdf comme une vraie com­
mande, il faut le rendre exécutable (avec chmod a+x latex2pdf), le placer
dans un répertoire présent dans le $PATH (comme -/bin si on a pris le soin de
l’inclure dans le $PATH, voir pages 101 et 104), et rajouter une ligne au début
du fichier qu’on appelle sHEBANG et qui indique au système d’exploitation quel
shell il faut utiliser pour interpréter le programme :
#! /bin/sh = L’espace ewtre ! et / est optionnel
Ces modifications réalisées, on peut alors exécuter ce script comme on
le ferait pour n’importe quelle autre commande :
% latex2pdf
La seconde amélioration de ce script est d’utiliser set -e (voir page 106)
qui force le shell à interrompre l’exécution du script à la première commande
qui retourne une erreur, ce qui rend l’utilisation de && inutile (parce que impli­
cite). Utilisez set -e de manière systématique, car les commandes d’un script
sont en général interdépendentes, et il n’est pas utile de continuer si l’une
d’elles ne s’est pas déroulée correctement.
#! /bin/sh
set -e
latex doc.tex
dvips doc.dvi -o
ps2pdf doc.ps
Puisqu’il ne change pas, nous allons omettre le shebang des autres pro­
grammes présentés dans ce chapitre. Ne l’oubliez pas pour autant! Nous fe­
rons de même pour la ligne set -e.
Toutes les constructions utilisables depuis la ligne de commande le sont
aussi depuis les scripts, et vice versa, à une exception notable près : puisque
les shells non-interactifs ne lisent en général pas leurs fichiers de configuration,
aucun alias n’y est défini”.
Comme dans les fichiers de configuration, on peut rajouter des commen­
taires dans les programmes en les faisant précéder d’un signe #, comme ceci :
# une ligne de commentaires
On peut aussi les utiliser en fin de ligne :
ps2pdf doc.ps # transformation finale en PDF
Pour faciliter la relecture et la modification des programmes, il est particu­
lièrement recommandé de bien les commenter.
2. Par contre, vos variables d’environnement personnelles sont accessibles, car c’est le shell
depuis lequel vous lancez le script qui les met en place, et non celui qui interprète le script.
7.2 — LES VARIABLES 139
7.2 Les variables
Pour gagner en généralité, on a souvent besoin de manipuler du « texte »
de manière précise. Ainsi, si l’on veut que le programme latex2pdf précé­
dent travaille sur un fichier passé en argument, on doit être capable d’en
modifier le nom pour obtenir celui des fichiers .dvi, .ps, etc. Tout ceci est
possible en utilisant des VARIABLEs qui permettent de stocker et de manipuler
des CHAÎNES DE CARACTÈRES.

a. Définition et utilisation des variables


On définit des variables de la manière suivante :
f="doc.tex" Jamais d’espaces autour du signe =
message="Je vais convertir"
Ce code définit les variables f et message, qui contiennent respectivement
«doc.tex»et« Je vais convertir ». La syntaxe n’est pas sans rappeler les
variables d’environnement*, qui sont en effet des variables normales « expor­
tées » dans l’environnement afin que d’autres programmes puissent s’en servir.
On utilise ces variables de la même manière que les variables d’environne­
ment ; par exemple, avec les définitions précédentes, le code
echo $message $f
produit la sortie
Je vais convertir doc.tex
On peut inclure des variables dans la définition d’une autre, par exemple :
f="doc.tex"
message="Je vais convertir $f"
echo $message
qui donne la même sortie que le code précédent. Soyez avertis néanmoins que
si la variable f change après la définition de message, ceci ne se reflétera pas
sur le contenu de message.
Les noms des variables (comme « f » ou « message ») ne peuvent contenir
que des lettres non accentuées, des chiffres (sauf en début de nom) et le signe
souligné « _ ». Bannissez tout autre caractère.
Exploitons les variables pour rendre le script latex2pdf plus général,
en le réécrivant de la manière suivante* :

prefix=doc Le nom des fichiers, sans extension


latex $prefix.tex = doc.tex
dvips $prefix.dvi -o = doc.dvi
ps2pdf $prefix.ps = doc.ps
3. Voir page 99. ;
4. Même si nous ne les avons pas mis, n’oubliez ni le shebang, ni la ligne set -e au début !
140 CHAPITRE 7 — LIRE ET ÉCRIRE DES PROGRAMMES

Il n’est pas encore utilisable en l’invoquant avec un nom de fichier en argu­


ment mais, sous cette forme, il n’y a plus qu’une seule ligne à modifier si l’on
souhaite travailler sur un autre fichier, au lieu de trois dans la version précé­
dente : on a donc gagné en généralité.
Pour ajouter l’extension à « $prefix », on l’y a simplement accolée sans
plus de précautions. Si ceci ne pose pas de problème quand le texte à ajouter
commence par un point°, cela peut en revanche prêter à confusion dans le cas
suivant :
echo $prefix_1.tex P vn P ef ­
suivie de & :tex »
Interprété comme la variable pretix_{

Pour lever l’ambigüité, on utilise des accolades :


echo ${prefix}_1.tex _ C’est bien la variable prefix suivie de _I.tex
Signalons enfin que l’on peut changer la valeur d’une variable :
f=doc.tex
f=doc2.tex
echo "Je m’occupe de $£" Donne & Je m'occupe de docZ2tex »

b. Que faire quand ça ne marche pas ?


Dès lors que l’on utilise des variables ou d’autres constructions dont l’ef­
fet n’est pas évident à la lecture du programme, il est possible de faire des
erreurs (et cela arrive même assez fréquemment !). Imaginons que vous ayez
le programme suivant :
prefix=doc
latex $prefix_1.tex
dvips $prefix_1i.dvi
ps2pdf $prefix_1.ps
Ce programme ne fonctionne pas comme attendu. Pour comprendre pour­
quoi, on peut tirer parti de l’option -x du shell (qui affiche les commandes exé­
cutées) soit en rajoutant set -x au début du programme, soit, et c’est de loin
le plus pratique pendant la phase de mise au point, en lançant le programme
ainsi :
h sh -x latex2pdf
+ prefix=-doc
+ latex .tex
+ dvips .dvi Les sorties spécifiques des programmes ont ­
été omises
+ ps2pdf .ps
On voit alors que les commandes ne sont pas lancées avec les arguments
auxquels on pensait. Si l’on regarde plus en détail les lignes, on reconnaît
l’erreur mentionnée ci-dessus: on aurait dû écrire ${prefix}_1 au lieu de
$prefix_1.
5. Puisque le nom d’une variable ne peut pas comporter de point.
6. Tel qu’il est écrit, le code rajoute les extensions au contenu de la variable prefix_1, qui
est vide.
7.2 — LES VARIABLES 141
c. Les paramètres positionnels
On passe des arguments aux scripts comme à n’importe quelle commande”.
À l’intérieur du script, on accède à leurs valeurs à l’aide de variables spéciales,
les PARAMÈTRES POSITIONNELS : $1 (premier argument), $2 (deuxième), etc.
Ainsi, si l’on écrit un programme multiecho contenant les lignes suivantes :
echo Argument 1: $1
echo Argument 2: $2
voici ce qu’il donne sur un exemple :
% muitiecho premier ’2 ieme’ 3
$0 $l $2 $3
Argument 1: premier Le troisième argument est ignoré sans
Argument 2: 2 ieme autre forme de procès
Et les options ?
Ce mécanisme ne fait aucune différence entre « arguments » et « options » :
% multiecho -ps fichier -2
Argument 1: -ps
Argument 2: fichier

Exploitons cette possibilité pour munir le script latex2pdf d’une ébauche


de gestion des arguments, en remplaçant la première ligne par celle-ci :
prefix=$1 On copie le premier argument dans la variable prefix
et en le lançant de la sorte :
% latex2pdf doc — doc, pour travailler sur doc.tex, doc.dvi et doc.ps
En effet, cette première ligne assigne à la variable prefix la valeur du pre­
mier argument, $1. On aurait aussi pu remplacer $prefix par $1 dans tout
le script, mais, à l’usage, affecter les paramètres positionnels à des variables
dont le nom est plus explicite donne des programmes plus faciles à relire
et à modifier.
$0 : un paramètre positionnel particulier ­
$0 contient le nom de la commande en cours, telle qu’elle apparaît sur
la ligne de commande: 1latex2pdf, ./latex2pdf, etc. suivant la manière
dont vous l’avez lancé. Depuis la ligne de commande, il contient le nom
du shell (ce que nous avons exploité page 18).

7. Quand on le lance avec sh en ligne de commande, les arguments sont ceux qui suivent le
nom du script.
142 CHAPITRE 7 — LIRE ET ÉCRIRE DES PROGRAMMES

Utilisons maintenant les paramètres positionnels pour construire un script,


man2pdf, qui convertit une page de man en un fichier PDE Muni de l’op­
tion -Tps, man envoie sur sa sortie standard une version PostScript de la page
de man demandée ; il ne reste qu’à la faire suivre à ps2pdf :
man -Tps $1 | ps2pdf - $1.pdf & - À, vu page [20, force ps2pdf à
P P +ravailler sur son entrée standard
Les variables et les espaces
Il faut faire attention aux espaces, car ils donnent des résultats inattendus,
par exemple :
variable="a b" Âvec un espace entre à et b
touch $variable
On s’attendrait à ce que ce code crée un unique fichier a b (dont le nom
contient un espace), mais en réalité il en crée deux, a et b, parce que le shell
délimite les arguments après avoir effectué le remplacement de $variable,
et coupe donc entre a et b. Pour éviter ce genre de problèmes, il faut utiliser
des guillemets doubles® :
touch "$variable" (rée bien le fichier & à b »
Tant que le contenu de la variable prefix était connu au moment du lance­
ment du script, le problème ne se posait pas, mais maintenant que l’on utilise
des-arguments, le contenu de la variable n’est pas connu a priori et il faut donc
prendre des précautions :
prefix="$1"
latex "$prefix".tex
les commandes se lanceront comme prévu
dvips "$prefix".dvi -o
même si $l contiert des espaces
ps2pdf "$prefix".ps
On aurait pu écrire "$prefix.ps", mais la notation choisie a aussi l’avan­
tage de supprimer les problèmes mentionnés ci-dessus : "$prefix"_1.ps n’est
pas ambigü.

Tous les paramètres d'un coup : "$e"


On a parfois besoin de représenter d’un coup tous les arguments d’un
script, en particulier lorsqu’on écrit un « enrobage » (wrapper en anglais) au­
tour d’un programme. On utilise dans ce but la construction spéciale "$@",qui
se comporte exactement comme "$1" "$2" etc. Utilisons-la pour un script
qui concatène tous les fichiers PDF passés en argument en un seul fichier
tous.pdf :
pdftk "$@" cat output tous.pdf
Attention, l’utilisation des guillemets doubles autour de $@ est indispensable !

8. Les guillemets simples ne fonctionneront pas car ils désactivent le caractère spécial $.
7.2 — LES VARIABLES 143
d. Utilisations avancées des variables
Pour aller plus loin dans la généralisation de 1atex2pdf, on aimerait lui
fournir directement le nom du fichier .tex (ce qui fait meilleur ménage avec
la complétion automatique). Il faut alors en supprimer l’extension .tex pour
obtenir le contenu de la variable base.
Le shell fournit une syntaxe pratique pour réaliser ce type d’opérations :
on peut supprimer une partie au début (##) ou à la fin (4%) d’une variable
au moment de son utilisation de la manière suivante :

a=’document? 3uppriWæ...
echo ${ahkent} … le & ext » final du contenu de à : & docum »
echo ${attdoc} … le & doc ® initial du contenu de à : & umert »
echo ${akkdoc} … un « doc » final (non présent) : « document »
echo $a La variable à n°a pas été pas modifiée : & documerct »
Tirons parti de cette construction pour améliorer 1atex2pdf afin qu’il ac­
cepte directement le nom du fichier .tex en argument, comme :
% latex2pdf document.tex
Il suffit pour cela de remplacer sa première ligne par la suivante :
; _ prefix est désormais le premier argument
prefix="${1kk.tex}" vrivé du suffixe ex (s'il existe)
Puisque l’on manipule plusieurs fichiers avec la même extension (doc.tex,
doc.dvi, etc.), la complétion automatique s’arrête dans un premier temps sur
« doc. ». Si l’on veut que le programme accepte aussi cette entrée, on peut
rajouter la ligne suivante :
prefix="${prefix%%.}" Supprime le poit final de prefix, s’il y en à un
Pour des manipulations plus complexes, on peut exploiter les guillemets
inverses et des programmes dédiés, comme les programmes basename et son
compagnon dirname, qui affichent respectivement la partie « fichier » et « ré­
pertoire » du chemin passé en argument” :
% basename articles/janvier/article.tex
article.tex
% dirname articles/janvier/article.tex
articles/janvier
Un des défauts de IATEX est qu’il fonctionne mal si on le lance sur des
fichiers qui ne sont pas dans le répertoire courant'°. Utilisons basename et
dirname pour pallier ce problème, en se plaçant automatiquement dans le
répertoire contenant le fichier :
9. Ces programmes n’acceptent qu’un seul chemin en argument. basename peut aussi suppri­
mer une extension que l’on passe en second argument.
10. Si ces fichiers en incluent d’autres, comme des images.
144 CHAPITRE 7 — LIRE ET ÉCRIRE DES PROGRAMMES

fichier=‘basename "$1"‘ = Partie & nom de fichier » de l’argumenct


repertoire=‘dirname "$1"“ Partie & répertoire » de l’argument
cd "$repertoire" On se place dans le répertoire
prefix="${fichier%#.tex}" On supprime l’extension du nom de fichier
# reste du code comme précédemment
Pour plus de flexibilité, on peut aussi penser à sed!!. Par exemple, la com­
mande suivante assigne à prefix le premier argument privé de sa dernière
extension, quelle qu’elle soit :
prefix=‘echo $1 | sed ?s/\.[7.]+$//>‘
Arithmétique du shell
Le shell est capable d’effectuer des opérations arithmétiques élémentaires
sur les nombres entiers!? : additions (+), soustractions (-), multiplications (+),
divisions (/) et restes de divisions (modulo, %), de la manière suivante :
% echo $((2 + 3*4))
14
% prix=1230
% echo "$(($prix/100)) euros et $(($prix}100)) centimes"
12 euros et 30 centimes
On peut insérer autant d’espaces que l’on veut autour des opérateurs. Cette
construction sert souvent pour incrémenter un compteur dans des boucles :
a=$(($a+1)) Incrémente la variable $a de |.
Il ne faut pas oublier les $ ( (...)). En effet, si on écrit
a=$a+1
alors, si $a vaut initialement 1, elle contient après l’exécution de ce code
le texte « 1+1 ».

e. Et les variables d'environnement ?


Les variables d’environnement sont accessibles depuis les scripts comme
des variables normales, ce qui fournit un moyen rudimentaire de passer des
informations optionnelles au script. Par exemple, si l’on remplace la génération
du fichier pdf par la ligne :
ps2pdf $PS2PDF_OPTIONS "$prefix".ps
et que l’on lance 1atex2pdf avec une valeur pour $PS2PDF_OPTIONS :
% PS2PDF_OPTIONS=-dCompatibility=1.2 latex2pdf doc.tex
la commande ps2pdf lancée par le script est effectivement :
11. C’est d’ailleurs la seule possibilité de supprimer des préfixes/suffixes de variables dans
tcsh, voir page 160.
12. Et aussi sur des nombres à virgule flottante pour zsh.
7.3 — LES TESTS 145
ps2pdf -dCompatibility=1.2 doc.ps
ce qui produit un PDF version 1.2 (au lieu de 1.4 par défaut).
L’absence de guillemets autour de $PS2PDF_OPTIONS est intentionelle :
si l’on veut passer plusieurs options (séparées par des espaces), il est néces­
saire que celles-ci soient considérées comme des arguments distincts.

7.3 Les tests


Quand les programmes se développent et se complexifient, il est quasiment
inévitable d’avoir à traiter à part des cas particuliers, par exemple pour ne
lancer une commande que si son argument est bien un fichier existant, ou
bien pour ne régénérer un fichier que s’il n’est plus à jour. On utilise pour
ce faire des tests.

a. if/then/e1lse/fi: exécutions conditionnelles


Lorsque les documents IATEX contiennent un index, il est nécessaire de ré­
générer l’index après une première compilation (en utilisant makeindex sur le
fichier . idx) et d’en lancer une seconde pour s’assurer que l’index est à jour.
Comme ces étapes sont longues, il est préférable de ne les inclure que lors­
qu’un index est bien présent dans le document, ce qui est impliqué par la pré­
sence de la commande \printindex!*. On aimerait donc subordonner la régé­
nération de l’index au résultat de fgrep \printindex. Ceci est déjà possible
en utilisant && (page 115) :
fgrep ’\printindex’ "$prefix".tex && \
makeindex "$prefix".idx && \
latex "$prefix".tex
Cet enchaînement de commandes donne le résultat prévu car fgrep"*
« réussit » s’il trouve au moins une occurence du texte à cherche, et « échoue »
sinon. Cela dit, cette construction n’est ni élégante ni facile à utiliser, et elle
ne se généralise pas à plusieurs cas mutuellement exclusifs : que faire si l’on
a besoin de lancer une commande aussi s’il n’y a pas d’index ? On utilise plutôt
dans ce but la construction suivante :
if fgrep ’\printindex’ "$prefix".tex; then
echo "Régénération de l’index"
makeindex "$prefix".idx Commandes exécuctées si fgrep
latex "$prefix".tex réussit
else
Commandes exécutées sinon
echo "Pas d’index présent dans $prefix.tex"
fi — Inverse de & if », signale la fin de la construction
13. Ce n’est pas la seule possibilité, mais ceci couvre une grande partie des cas.
14. C’est bien sûr aussi le cas de grep et egrep.
146 CHAPITRE 7 - LIRE ET ÉCRIRE DES PROGRAMMES

Ce morceau de code se lit: « si (if) la commande fgrep réussit, alors


(then) exécuter les commandes echo, makeindex et latex. Sinon (e1lse),
exécuter la seconde commande echo ».
On révise !
Le test précédent a pour effet secondaire d’afficher la ou les lignes qui
contiennent \printindex. Comment feriez-vous pour supprimer leur af­
fichage ?

Enfin, on peut enchaîner autant de tests que l’on veut en utilisant e1if
(pour else if, « sinon, si »). Par exemple, si l’on utilise parfois un autre sys­
tème d’index personnel, introduit par \indexperso, on pourrait lancer les
commandes nécessaires à sa préparation ainsi :
if fgrep ’\printindex’ "$prefix".tex; then
Commandes pour l’index & standaid »
elif fgrep ’\indexperso’ "$prefix".tex; then
Commandes pour l’index « perso »
else
Commandes s’il n°y à pas d’index
fi
Indentation
Dans les exemples précédents, nous avons systématiquement indenté
de quelques espaces les commandes appartenant à un bloc if/fi. Même
si cela n’est pas obligatoire, c’est très recommandé puisque cela améliore
la lisibilité des programmes, en faisant bien ressortir quelles commandes
sont exécutées dans quelles conditions.

S’il est vrai que n’importe quelle commande peut être utilisée dans un test,
l’une d’entre elle l’est particulièrement : c’est la commande [, aussi connue
sous le nom de test. Elle permet de réaliser tous les tests couramment utilisés
dans les languages de programmation : comparaisons de textes, de nombres,
tests sur des fichiers, etc.
Imaginons que nous voulions doter 1atex2pdf d’une option, -c, deman­
dant la production d’un fichier PostScript compressé plutôt que PDE Dans un
premier temps, pour simplifier, nous allons supposer que cette option se place
après le nom du fichier!*, ainsi :
% latex2pdf doc.tex -c
Pour implémenter cette option, il suffit de remplacer la dernière étape par
gzip dans le cas où $2 vaut -c, ce que l’on peut écrire ainsi :
15. Gérer l’option en premier est plus difficile, nous le ferons page 149.
7.3 — LES TESTS 147
if [ "$2" = -c ]; then N’oublier ni les espaces, ni les [], ni ; !
gzip "$prefix".ps
else
fi

["$a" = "$b" ] — si $a est égal à $b


[ "$a" \!= "$b" ] si $a est différent de $b
[ -z "$a" ] si $a est vide ou n’est pas définie!”
[ "$a" ] si $a n’est pas vide
Tests numériques
[ "$a" -eq "$b" ] sile nombre $a est égal au nombre $b!®
[ "$a" -ne "$b" ] sile nombre $a est différent du nombre $b
[ "$a" -gt "$b" ] si $a est strictement supérieur à $b
[ "$a" -1t "$b" ] si $a est strictement inférieur à $b
[ "$a" -ge "$b" ] si $a est supérieur ou égal à $b
[ "$b" -le "$a" ] si $a est inférieur ou égal à $b
Tests sur les fichiers/répertoires
[ -e "$a” ] si le fichier ou répertoire $a existe
[ -f "$a" ] si $a est un fichier
[ -à "$a" ] si $a est un répertoire
[ -r "$a" ] si $a existe et qu’on a le droit de le lire
[ -w "$a" ] si $a existe et qu’on a le droit de le modifier
[ -x "$a" ] si $a existe et qu’on a le droit de l’exécuter
[ "$a" -nt "$b" ] si le fichier $a est plus récent que le fichier $b
Opérations
['\! test ] l’opposé de test: ainsi, [ "$a" \!= "$b" ] est
équivalent à [ \! "$a" = "$b" ]
[t1 -at2] tl ET t2
[t -o t2] t1 OUt2
148 CHAPITRE 7 — LIRE ET ÉCRIRE DES PROGRAMMES

On peut par exemple exploiter les tests sur les fichiers pour interrompre
l’exécution de latex2pdf si l’on s’aperçoit que l’on n’a pas la permission de lire
le fichier $prefix.tex initial :
if [ \! -r "$prefix".tex ]; then
echo "Erreur: on ne peut pas lire $prefix.tex"
exit 1
fi
exit 1 termine immédiatement le programme en indiquant qu’il y a eu
uné erreur!°, ce qui bloquerait l’exécution de xpd£ si on l’utilise ainsi :
% latex2pdf doc.tex && xpdf doc.pdf
[ et test : deux noms pour la même commande
On peut aussi utiliser [ sous le nom test ; dans ce cas, le ] fermant n’est
pas nécessaire. Ainsi, le test précédent pourrait s’écrire :
if test \! -r "$prefix".tex ; then

‘if [ -r $fichier ] && ps2pdf $fichier; then


Exécucté si l’on a le drott de live $fichier et si pschh° à fonctionné
ou bien
if [ -r $fichier ] || [ -x $fichier] ; then
Exécuté si $fichier est lisible ou exéeuctable

C. case/esac: sélection par des valeurs


On a souvent besoin d’exécuter différents codes suivant les valeurs d’une
variable, comme ça a été le cas pour $2 précédemment. Si l’on veut distinguer
entre plusieurs valeurs, on peut utiliser une série de if/elif, mais ceci de­
vient rapidement illisible. L’instruction case a été conçue spécialement pour
des cas de ce type ; on l’utilise de la manière suivante :
case $USER in Ne pas oublier les doubles
vf) echo "Bonjour Vincent" poirets-virgules !
echo "Une deuxième commande pour Vincent" ;;
b*) echo "Un nom qui commence par b" ;;
*) echo "Le reste" ;;
esac Inverse de & case D, termine la construction
Dans ce cas, les différentes commandes, ou séries de commandes (séparés
par des « ; » ou des sauts de lignes, comme d’habitude), sont exécutées suivant
les valeurs de $USER. Pour terminer une série de commandes et passer au cas
pas vrai) alors que ce sont des nombres identiques (donc -eq est vrai).
19. exit O permet quant à lui de terminer en indiquant que tout s’est bien passé.
7.3 — LES TESTS 149
suivant, il est impératif d’utiliser des doubles points-virgules « ; ; », sans es­
paces entre eux. La partie précédent « ) » se comporte comme un glob qui est
comparé à $USER*°. Pour obtenir un résultat équivalent avec if/elif/e1se,
on aurait pu écrire :
if [ "$USER" = vf£f ]; then
echo "Bonjour Vincent"
echo "Une deuxième commande pour Vincent"
elif echo $USER | grep ’“b’ > /dev/null; then
echo "Un nom qui commence par b"
else
echo "Le reste"
fi
Utilisons cette construction pour offrir une seconde option à latex2pdf,
-P, qui lui demande de s’arrêter au fichier PostScript sans le compresser, en rem­

case "$2" in ;
‘plaçant le if [ "$2" = -c ]; then … fi par:

-c) echo "Production de $prefix.ps.gz"


gzip "$prefix".ps ;;
-P) echo "On s’arrête à $prefix.ps" ;;
*) echo "Production de $prefix.pdf"
ps2pdf "$prefix".ps ;;
esac

Astuce : partager un -/.bashrc entre plusieurs machines


Pour partager un fichier -/ .bashrc entre plusieurs machines, il peut être
judicieux de baser une partie de la configuration (comme les adresses élec­
troniques) sur le nom de la machine, qu’on obtient avec hostname :
case ‘hostname“‘ in
totoro*) EMAIL=vincent@totoro.example.org ;;
travail*) EMAIL=fourmond@travail.example.com ;;

d. Et l'option en premier ?
Pour simplifier, nous avons jusqu’à présent traité le cas où l’option que l’on
passe à latex2pdf vient en second, ce qui est contraire aux usages établis
en ligne de commande. Voyons comment faire pour que l’option soit le premier
argument de latex2pdf. La difficulté principale est que le nom du fichier
est soit dans $1, soit dans $2, suivant que $1 est ou non une option, ce qui
complique la détermination de prefix :
20. Au détail près que « / » n’est pas spécial comme dans les glob du shell : * détecte aussi du
texte contenant des « / ». En particulier, « * » tout seul détecte forcément toutes les valeurs (y
compris une variable « vide »), c’est pourquoi il doit être placé en dernier. On peut aussi offrir
plusieurs possibilités séparées par des barres verticales : fromage |dessert).
150 CHAPITRE 7 — LIRE ET ÉCRIRE DES PROGRAMMES

case "$1" in
-c) prefix="${2h4.tex}"; ;
-P) prefix="${24%.tex}"; ;
*) prefix="${1%%.tex}"; ;
esac
Il suffit ensuite de remplacer case "$2" par case "$1" dans l’écriture de
la dernière étape donnée ci-dessus. Cela dit, cette solution manque d’élégance
et surtout de robustesse, car si le programme accepte plusieurs options en
même temps, comment faire pour retrouver quel paramètre positionel contient
l’option qui concerne la dernière étape ? Il est préférable d’interpréter les op­
tions au début, et de stocker les options dans des variables appropriées, plus
faciles à lire. Pour simplifier la gestion des paramètres, on utilise shift, qui dé­
cale les paramètres positionnels : $2 devient $1, $3 devient $2, et $1 est perdu.
On s’en sert pour supprimer le premier argument, s’il s’agit d’une option :
case "$1" in
-c) ps_command=gzip
shift; ;
-P) ps_command=""
shift;;
*) ps_command="ps2pdf" ;;
esac
prefix="${1h%.tex}"
# latex et dvips
if [ "$ps_command" ] ; then
"$ps_command" "$prefix".ps
fi
L’idée utilisée ici est de stocker le nom de la commande à utiliser sur le fi­
chier .ps dans la variable ps_command ; le dernier test vérifie que cette va­
riable n’est pas vide (ce qui arrive si $1 n’est pas -P).

7.4 Les boucles


Les boucles sont des instructions qui permettent de répéter des portions
d’un script, pour travailler successivement sur chacun des arguments d’un pro­
gramme, tous les fichiers d’un répertoire, etc.

a. while: répéter tant qu’une condition est remplie


La boucle while (« tant que ») répète une série de commandes tant qu’une
condition est remplie. Combiné à shift, c’est le moyen idéal de travailler sur
tous les arguments d’un programme :
wvhile [ "$1" ]; do Torct que l’argument | n’est pas vide
prefix="${1%%.tex}"
latex "${prefix}".tex Et dvips, ps2pdf etc.
7.4 — LES BOUCLES 151
shift On passe à l’argument suivant
done N’oublier ni do, ni done !
Le code qui est placé entre do et done est exécuté tant que l’argument $1
n’est pas vide ([ "$1" ]). On y a placé le code de latex2pdf, suivi de l’ins­
truction shift, qui décale tous les arguments, ce qui permet de passer au
suivant. Si on oublie shift, la boucle tourne éternellement sur le premier
argument — jusqu’à ce qu’on appuie sur “C.
Les boucles while ne servent pas qu’à parcourir la liste des arguments ;
voici un programme, puissance, qui porte le nombre passé en premier argu­
ment à la puissance du deuxième :
a="$1"; b="$2"; i=1; 1=1
while [ "$i" -le "$b" ]; do
r=$(($r * $a))
i=$(($i + 1))
done
echo $r
Il s’utilise ainsi :
h puissance 3 4
8i 3*=81
Chaque itération de la boucle incrémente le compteur $i de 1 et multiplie
le résultat $r par $a (le premier argument). La condition cesse d’être remplie
lorsque $b itérations ont été effectuées.
Analyse des options avec getopts et vhile
Le shell est doté d’une fonction puissante pour interpréter de multiples
options, avec groupage : getopts. Employons-la pour rendre l’analyse des op­
tions de latex2pdf des pages précédentes plus robuste :
ps_command="ps2pdf"
while getopts co:P option; do
case $option in
c) ps_command=gzip ;;
P) ps_command="" ;;
o) ps_command="$0PTARG" ;;
esac
done
shift $(($0OPTIND - 1))
prefix="#{1%%.tex}"
Puis lætex, dvips et $ps_command
getopts analyse une à une les options présentes sur la ligne de commande
et les stocke dans une variable, ici « option ». Cette commande prend deux
arguments : la liste des options que le programme doit accepter, et le nom de
la variable qui contient l’option en cours. Si une option est suivie de :, elle ac­
cepte un paramètre ; ce paramètre est stocké temporairement dans la variable
152 CHAPITRE 7 — LIRE ET ÉCRIRE DES PROGRAMMES

$OPTARG*!. On utilise ici cette possibilité pour remplacer la dernière étape par
une commande arbitraire, passée en argument de l’option -o.
getopts « réussit » tant qu’il reste encore des options à analyser : la boucle
while ci-dessus est donc exécutée pour toutes les options. Enfin, la partie
shift $(($OPTIND - 1)) supprime les arguments qui ont été interprétés en
tant qu’options, de sorte que $1 contienne le premier argument qui n’est pas
une option.
Cette manière de procéder est plus robuste et plus flexible que précédem­
ment, puisqu’on peut par exemple lancer 1atex2pdf ainsi :
% latex2pdf -o 1p document.tex
Cette commande exécute 1atex2pdf avec ps_command qui vaut 1p*. L’utili­
sation de getopts offre à vos scripts une interface digne de la ligne de com­
mande, n’hésitez pas à l’utiliser quand vos scripts commencent à s’étoffer.

b. for: répéter pour une liste de valeurs


for, « pour », répète des commandes pour différentes valeurs d’une va­
riable. Par exemple,
for f in a b c; do
echo $f
done

lance echo $f successivement pour f=a, f=b et f=c. Un des attraits de cette
construction est que l’on peut utiliser des globs dans la liste des valeurs. Ainsi,
dans le code suivant, £ parcourt la liste des fichiers .png du répertoire cou­
rant:
for f in *.png ; do
echo "Je convertis $f"
convert $f£ ${f//.png}.jpeg
done

L’utilisation d’un scanner pour numériser un document donne souvent une


série de fichiers page-0001 . jpeg, page-0002. jpeg, etc., que l’on souhaite
généralement assembler en un unique fichier PDE Voici un script qui accepte
comme argument le préfixe (ici page), qui convertit chacun de ces fichiers en
PDF et les assemble :
prefix="$1"
for f in "$prefix"*.jpeg; do
convert "$f" "${f£/%.jpeg}".pdf
done
pdftk "$prefix"*.pdf cat output "$prefix".pdf
21. Il faut utiliser $OPTARG rapidement, car sa valeur est écrasée à l’appel suivant de getopts.
On peut utiliser « : » pour autant d’options que l’on veut.
22. 1p imprime un document PostScript sur l’imprimante par défaut.
7.5 — UN EXEMPLE COMPLET : N'OUBLIEZ PLUS LES ANNIVERSAIRES ! 153

À vous de jouer

c. for en ligne de commande


Tout comme les autres constructions que nous avons vues dans ce chapitre,
les boucles for peuvent aussi être utilisées directement en ligne de commande.
Leur particularité est qu’elles s’y prêtent très bien :
% for f in *.png; do Ôn peut passer à la ligne
> convert "$f" "${f/%.png}".jpeg L’invite devierct >
> done La commande se lance quand « done » est ectré
Les boucles for en ligne de commande offrent une alternative complète
à xargs, puisque l’on peut utiliser des guillemets inverses pour définir les
objets sur lesquels travailler :
% for f in ‘fgrep TODO *.txt | cut -d: -f1 | unig‘; do
> 3.2PS ll$fll
> done
Cette commande lance a2ps”* sur tous les fichiers texte du répertoire courant
qui contiennent le texte TODO**. Tout comme avec xargs, il est nécessaire
de prendre des précautions particulières lorsque les noms de fichiers peuvent
contenir des espaces”°,
Pour des commandes complexes, il est conseillé de construire les com­
mandes une par une en les préfixant d’abord de echo et de supprimer echo
une fois qu’on s’est assuré que les commandes sont bien celles que l’on sou­
haite lancer.

7.5 Un exemple complet : n’oubliez plus les anniversaires !


Nous allons maintenant exploiter nos acquis pour écrire un programme
permettant de ne plus oublier de souhaiter les anniversaires. Le principe est
d’envoyer plusieurs messages de rappel grâce à at”°.
S’il est vrai qu’il existe déjà des solutions pour ne pas oublier un évène­
ment (suites de messagerie, agenda en ligne, voire en ligne de commande?7),
l’écriture d’un script propre nous donne d’une part la maîtrise des données et
d’autre part la possibilité de rajouter rapidement de nouvelles fonctionalités.
23. Programme qui imprime divers types de fichiers.
24. unig est indispensable pour ne pas imprimer un fichier plusieurs fois s’il contient plusieurs
occurrences de TODO. On aurait aussi pu utiliser fgrep -1 TODO «.txt et se passer de cut.
25. Il faut dans ce cas faire précéder for des incantations « t="$IFS" ; IFS=$"\n° ; » et faire
suivre done de « ; IFS="$t" ». IFS est une variable spéciale du shell qui joue un rôle similaire
à l'option -d de xargs.
26. at est préférable à cron, pour les cas où l’ordinateur est éteint au moment de l’échéance.
27. calendar est un outil standard de la ligne de commande pour gérer son agenda.
154 CHAPITRE 7 — LIRE ET ÉCRIRE DES PROGRAMMES

* Écrivons.les informations dans un simple fichier texte, -/.anniversaires


par exemple, à raison d’une date par ligne :
01.10.2007: Morgane Format : jour.mois.année
28.07.2004: Sophie
Voici la manière dont nous allons procéder :
— En utilisant xargs -d \\n -I%, on se ramène à écrire un programme,
chier)8 : '
anniversaires, qui ne prend qu’un seul argument (une ligne du fi­

— on découpe chaque ligne en deux parties séparées par un « : », la date


de naissance et le prénom avec « cut -d: »;
— «cut -d. » permet de scinder la date en d’une part jour .mois, qui sert
à fixer la date dans l’année (passée directement à at), et d’autre part
l’année :
— on calcule l’Âge, et on s’en sert pour préparer le message ;
— et finalement, on utilise at pour planifier l’envoi de ces messages 7 et 3
jours avant la date. Les messages eux-mêmes sont simplement des com­
mandes echo, dont la sortie est envoyée à l’utilisateur après l’exécution
de chaque commande**.
Voici le script anniversaires:
annee=‘date +4Y‘ # l’année en cours, 2012
date=‘echo "$1" | cut -d: -f1° À 01.10.2007
nom=‘echo "$1" | cut -d: -f2°* # Morgane
atdate=‘echo $date | cut -d. -f1,2‘.$annee # 61.10.2012
age=$(($annee - ‘echo $date | cut -d. -f3°‘)) # S
message="$nom aura $age ans le $date"
echo "echo $message - dans 7 jours" | at $atdate - 7 days
echo "echo $message - dans 3 jours" | at $atdate - 3 days
On le lance ainsi, en début de chaque année“®
% xargs -d \\n -I% anniversaires % < -/.anniversaires
Un point particulier mérite attention : les « doubles echo » pour le lance­
ment de at. On veut que l’entrée standard de at $atdate - 7 days soit la
commande :
echo $message - dans 7 jours
28. On peut utiliser la fonction shell read pour lire directement un fichier depuis le shell ;
cependant, son usage est pour le moins délicat.
29. On aurait aussi pu utiliser mail pour envoyer les messages.
30. On pourrait améliorer ce script pour prévoir d’un coup les 100 prochaines années, par
exemple ; nous y reviendrons dans les exercices. On peut par ailleurs rajouter cette commande
dans un crontab O O O O * xargs.….
7.6 — POUR ALLER PLUS LOIN 155
Il suffit de lancer echo avec cette commande comme argument.
Un conseil : utilisez beaucoup de variables
Ce petit programme montre déjà que l’utilisation de variables appropriées
permet de clarifier le code, sous réserve qu’elles soient nommées de manière
évocatrice.

7.6 Pour aller plus loin


Vous êtes désormais capable d’écrire des scripts adaptés à vos besoins pour
automatiser des tâches que vous effectuez souvent. Voici deux conseils qui
vous permettront de progresser rapidement.
En premier lieu, efforcez-vous d’écrire des scripts pour réaliser toutes les
tâches que vous devez effectuer trois fois ou plus. Prenez-vous au jeu et es­
sayez de réaliser des scripts les plus généraux possibles. Évidemment, vous
perdrez du temps initialement, mais cet investissement sera largement récom­
pensé le jour où vous devrez effectuer cette même tâche un millier de fois.
Et même si ce n’est pas le cas, vous aurez tout de même appris quelque chose.
Accessoirement, ce genre d’exercice permet de transformer une tâche répéti­
tout à y gagner. |
tive et inintéressante en un mini-défi faisant appel à votre créativité : vous avez

Par ailleurs, essayez de lire et de comprendre les codes écrits par d’autres
programmeurs. De nombreux programmes pas trop compliqués peuvent être
trouvés dans le répertoire /etc/init.d, qui contient les scripts de démarrage
de la machine (lancement du serveur SSH ou d’une interface graphique, par
exemple). Commencez par les plus petits*!. Si une commande vous échappe,
cherchez-la avec man ou dans bash(1). L’utilisation d’un éditeur avec colora­
tion syntaxique comme Emacs ou nano facilite grandement la lecture.
Une commande fréquemment utilisée dans ces scripts est le point « . »:
. un/fichier permet de lire et d’exécuter un/fichier ; c’est un synonyme
de source**. Les fichiers appelés de la sorte dans les scripts de démarrage
contiennent souvent des définitions de variables qui contrôlent la manière
dont le service est lancé.
Vous pouvez aussi chercher des scripts dans /usr/bin; la commande
egrep ?”#!\s*/bin/(ba)?sh? /usr/bin/+* est un bon point de départ.

31. Que l’on trouve avec 1s -1S, par exemple !


32. Si ce n’est que source ne fonctionne pas en général dans les shells non-interactifs,
156 CHAPITRE 7 — LIRE ET ÉCRIRE DES PROGRAMMES

Résumé du chapitre
Un script shell est un fichier » if permet de tester le résultat de
exécutable commençant par le commandes, en particulier de [ : tests
shebang #! /bin/sh. sur les. chaînes de caractères, les
» Il contient des commandes, comme nombres et les fichiers.
celles qu’on tape directement dans le 1 4…
shell. » case/esac sertdifférents
à distinguer
cas suivant lés valeurs
» On y définit des variables en utilisant d’une variable.
le signe =, sans espaces autour.
» Les variables spéciales $1, $2, etc., » Les boucles while et for répètent
permettent d’accéder aux paramètres ‘ des commandes (y compris depuis la
du script. ligne de commande).

.1 Les mots pour le dire


Un cursrsesesus Est UN fichier texte qui contient des _ssrssisisesuss. SA
première ligne est UN _srssrsrses, Généralement # ! /_10ses/ _s Pour
exécuter ce programme, il faut le rendte _usisesisrsuseses, OÙ bien le
lancer directement avec __s
.2 Pour un siècle
Proposez une solution pour que le programme anniversaires planifie les
anniversaires pour le siècle à venir.
Astuce : utilisez une boucle !

.1 Un script est un fichier texte qui contient des commandes. Sa première ligne est un
shebang, généralement # ! /bin/sh. Pour exécuter ce programme, il faut le rendre
exécutable, ou bien le lancer directement avec sh.
2 Il faut lancer at une fois pour chaque année, ce qui implique l’utilisation d’une boucle.
La manière la plus naturelle est sans doute une boucle while, où l’on incrémente
$annee d’une unité à chaque itération :
annee=‘date +%Y‘
annee_finale=$(($annee + 100))
while [ $annee -le $annee_finale ]; do
date=‘echo "$1" | cut -d: -f1°
Code comme précédemment
annee=$((annee+1))
done
7 conseils

® Utilisez les raccourcis La complétion automatique et l’historique font ga­


gner du temps.

@ Utilisez des alias Ils permettent de gagner du temps et surtout de bénéfi­


cier sur le long terme, sans effort de mémorisation, de l’expérience acquise
au quotidien, par exemple en utilisant systématiquement les options que vous
jugez utiles.

@ Agissez en masse _ Pour des actions sur plusieurs fichiers, efforcez-vous d’uti­
liser xargs ou des boucles for. Avec l’habitude, vous gagnerez énormément
de temps. L’intervention manuelle fichier par fichier ne doit être qu’un ultime
recours.

@ Commentez _ Ajoutez autant que possible des commentaires dans vos scripts
et surtout dans vos fichiers de configuration, cela évite de perdre beaucoup
de temps quand il faut les modifier.

© Essayez _ La ligne de commande trouve tout son intérêt quand on arrive à


combiner des actions simples pour réaliser une tâche complexe — mais ceci
n’est possible qu’en vous entraînant : efforcez-vous d’utiliser des pipes dès que
c’est possible.

© Écrivez des scripts Ils vous permettront de mieux maîtriser tous les aspects
de la ligne de commande. De plus, contrairement aux commandes, ils laissent
une trace écrite : vous pourrez retrouver dans un an comment vous aviez fait !

® Rédigez des aide-mémoire _ Écrivez dans un fichier les résultats de vos re­
cherches dans les documentations : fonctionnalités insoupçonnées, combinai­
sons particulières de programmes ou d’options pour obtenir un résultat donné,
etc. Vous ne perdrez pas de temps la prochaine fois ! Cerise sur le gâteau, l’en­
voi d’un aide-mémoire bien fourni à un néophyte dans le besoin est toujours
bien reçu…
7 pièges à éviter

® Attention aux caractères spéciaux La plupart des erreurs des débutants en


ligne de commande proviennent de caractères spéciaux employés tels quels,
sans échappement. Consultez la liste page 20 si vous avez un doute.

@ Ne travaillez pas sans filet Pour des opérations délicates sur un grand
nombre de fichiers, utilisez d’abord 1s -1, echo, l’option -i de rm ou -n
de rename pour vérifier que vous allez bien faire ce que vous voulez, ou bien
réalisez une archive au préalable pour pouvoir revenir à la case départ.

@ Prudence Ne lancez pas une commande « pour essayer » sans la comprendre,


surtout si elle a été trouvée sur Internet. Les conséquences peuvent être immé­
diates et irréversibles.

® Globs et programmes de conversion Beaucoup de programmes de conver­


sion (comme convert ou ps2pdf) interprètent un second argument comme
le nom du fichier cible. N’utilisez pas de globs directement avec eux, mais
plutôt xargs en mode « un par un » ou des boucles for.

® Espaces et— _ Dans les définitions des variables (exportées dans l’environ­
nement ou non) et des alias, faites attention à ne mettre aucun espace autour
du signe =.

© Testez vos scripts _ Avant de lancer toute une série d’opérations « pour de
vrai » via un script, assurez-vous via des echo bien choisis que les variables
intérmédiaires pointent bien vers les fichiers cibles — y compris quand il y a
des espaces dans les arguments.

© Les shells du super-utilisateur | Tous ces avertissements s’appliquent à la


puissance dix dans le cas de shells avec des droits d’administrateur : non seule­
ment vous pouvez perdre toutes vos données, mais vous pouvez aussi endom­
mager sérieusement votre système voire l’effacer intégralement. La prudence
est de mise !
Comment trouver de l’aide ?

La ligne de commande ne se laisse pas aisément découvrir : impossible de


chercher dans des menus la fonctionnalité dont on a besoin. Voici cependant
quelques astuces qui permettent en général d’obtenir des informations sur
un programme (dont on aura trouvé le nom en suivant les conseils page 68),
son fonctionnement, et les options qu’il accepte.
Page de manuel
Le premier réflexe à avoir est de chercher sa page de manuel, soit directe­
ment, soit en utilisant apropos :
% man rsync
% apropos backup
Documentation au format info
Si les commandes précédentes ne donnent pas d’informations, on a parfois
accès à une documentation au format info en lançant la commande :
% info make
info est un système de documentation complémentaire à man ; il s’utilise
de manière similaire aux navigateurs 1ynx et w3nm.
Aide en ligne du programme
Si ceci échoue, on peut demander directement de l’aide au programme
grâce aux options --help ou -h, voire en le lançant sans arguments :
% handbrake --help
% handbrake -h Testez dans cet ordre
% handbrake
Attention, ces deux dernières commandes peuvent lancer des actions non vou­
lues; soyez prêt à taper 7C pour arrêter le programme s’il ne redonne pas
la main rapidement.
Autres documentation locales…
Des documentations au format texte, HTML ou PDF sont fréquemment
installées dans les répertoires /usr/doc, /usr/share/doc ou éventuellement
des variantes avec /usr/local ou /opt en lieu et place de /usr. Pour les
trouver :
% locate mdadm | grep -i doc | less
… et distantes
Une autre possibilité est d’utiliser un moteur de recherche pour trouver
la documentation du programme sur Internet. Pour cibler la recherche, il peut
être utile de rajouter Linux et documentation dans la requête.
Et si l’on n’utilise pas bash ?

Il existe des centaines de shells différents, chacun avec ses particularités,


ses forces et ses faiblesses, et, malheureusement, sa syntaxe… Parmi les plus
populaires, on peut distinguer deux grandes catégories : les shells de type
« Bourne »!, comme bash, ksh ou zsh“, et les shells de type « C »*, comme
csh ou tcsh. Nous n’avons présenté jusqu’à présent que bash car c’est le shell
le plus répandu, mais il est tout à fait possible d’en utiliser d’autres*. Nous
allons nous appuyer sur bash, zsh et tcsh pour illustrer les différences entre
les deux familles, ou entre shells d’une même famille ; attendez-vous à des
variations similaires pour d’autres shells.

Shell bash zsh tcsh


Fichiers de configuration et autres détails variables

Fichier de configuration -/.bashrc -/.zshrc -/.teshre


Type d’une commande type type OU which which
La manière de personnaliser les invites varie beaucoup d’un shell à un
autre ; voici trois commandes équivalentes pour ces trois shells® :
bash : PS1=?\u \w \W \h Voir PROMPT dans bask({)
zsh : PS1=%n %- %1d Ym? Voir PROMPT dans zshwise(1)
tesh: set prompt="/n %- %c1 Ym> Voir prompt dans +esh(1)

Différences principales entre shells « Bourne » et shells « C »


Pour tout ce qui concerne cette section, zsh se comporte comme bash.
En revanche, tcsh et les autres shells « C » s’en écartent notablement.
Variables et alias
Attention, les espaces sont indispensables autour des opérateurs arithmé­
tiques dans tcsh et les autres shells « C ».
« Bourne » « C» (page)
Variables d’environnement =— export A=b setenv À b 99
Variables du shell A=b set A=b 139
Évaluation arithmétique A=$((1+1)) @A 1+1 144
Alias alias t=tree alias t tree 95
Du nom de l’auteur du premier shell de ce type — aucun rapport avec Jason.
zsh incorpore aussi certaines fonctionalités des shells « C ».
Nommés ainsi parce qu’ils ressemblent au langage C.
Voir page 100 pour changer de shell, ou pour en essayer un autre.
gapwNH Voir page 106 pour la signification de ces symboles.
ET SI L’ON N'UTILISE PAS BASH ? 161

tcsh ne peut pas supprimer des parties d’une variable au moment de son
utilisation, comme ${a4b} pour bash, mais on peut toujours utiliser sed :
set b=‘echo $a | sed ?s/ent$//?“ Équivalent à b=#{a%%ent}
set b=‘echo $a | sed ?s/“doc//?“ Équivalent à b=4{adt#tdoc}
Redirection de la sortie erreur et globs
tcsh ne peut pas rediriger spécifiquement la sortie erreur, comme dans
1s 2>/dev/null pour bash (page 113). Cependant, on peut rediriger les
deux sorties d’un coup en utilisant >& comme dans bash.
tcsh ne reconnaît pas non plus la syntaxe {0. .9} ; par contre, il reconnaît
{a,b} (page 127).
Tests et boucles
Les boucles fonctionnent quasiment de la même manière :
for a in a b c; do foreach a (a b c)
done
echo $a«Shell
Bourne » $a
« B echo end «û»
Shell
Les tests basés sur [ sont assez similaires :

else
echo Il estelse
if [ -x fichier ]:; then if ( -x fichier ) then
là echo Il est là
echo Pas là echo Pas là
fi Shell & Bourne » endif Shell « € »
Pour tester le résultat d’une commande dans tcsh, il faut l’entourer d’ac­
colades, comme if ( { ps2pdf $fichier } ). Attention, les espaces sont
nécessaires®.

Particularités de zsh
Finissons cette section par quelques particularités de zsh qui le rendent
particulièrement intéressant — et qui en font pour moi le meilleur des shells.
Le glob spécial ** permet de descendre dans tous les sous-répertoires :
**/* . pdf trouve les mêmes fichiers que find. -name \*.pdf”.
=programme est remplacé par le chemin complet de programnme, ce qui est
utile pour modifier des scripts : enacs =latex2pdf.
La complétion automatique des noms de fichiers permet d’abréger d’autres
portions du chemin que le nom; par exemple, C/M/fi peut être complété
en Congres/Marseille/fichier, pour peu que la complétion soit unique.
Ceci permet de traverser une hiérarchie complète de fichiers en ne tapant que
la première lettre des sous-répertoires ! Enfin, l’appui successif sur :f25{ permet
de parcourir les différentes possibilités de complétion le cas echeant
6. Si l’on veut utiliser des pipes ou des redirections, il faut encore rajouter des parenthèses :
«if ( { ( cat $fichier | grep texte ) } )».
7. Attention cependant, du fait de la limitation en taille des lignes de commandes, il ne
fonctionne pas sur un très grand nombre de fichiers.
Installation de programmes

Nous allons décrire comment installer des logiciels qui ne seraient pas
présents sur votre machine.

Devenir root
Avant toute chose, pour effectuer des tâches d’administration système,
il faut acquérir les droits d’administrateur, c’est-à-dire ouvrir une session super­
utilisateur, root. Il existe pour cela deux méthodes :
% sudo bash ou bien & sudo -s »
Password: — |l fauct donner son mot de passe, pas celui de root
ou bien :
% su
Password: |l faut donner le mot de passe de l’utilisateur root
Les deux méthodes aboutissent à une session shell en tant que super­
utilisateur, ce que l’on peut vérifier ainsi :
% whoami
root Qui suis-je ?
Le super-utilisæteur
Depuis ce shell, on peut effectuer diverses tâches d’administration : ma­
nipuler les utilisateurs et les groupes, gérer les services, etc., et, ce qui nous
intéresse ici, installer des programmes.
Bien évidemment, aucune de ces deux méthodes ne fonctionne si vous
n’avez pas soit des droits administrateur spécifiques pour la première*, soit
le mot de passe de root pour la seconde.
-Attention !
Il faut être très prudent quand on passe root, une maladresse peut vite se
transformer en catastrophe !

1. En particulier, il faut que le fichier être autorisé à lancer un shell, dans le fichier de confi­
guration de sudo (qu’on édite avec visudo).
2. Si dans bien des cas, l’utilisation de gestionnaires de paquets est aussi simple que cette sec­
tion le suggère, cela ne se passe malheureusement pas toujours-aussi'facilement ; cette annexe
“n’a pas.pour vocation de se substituer à la documentation de votre gestionnaire de paquets.
INSTALLATION DE PROGRAMMES 163

Dans certains cas, avant de lancer une installation il faut mettre à jour
la base de données des paquets disponibles. Ensuite, il suffit de fournir au
gestionnaire de paquets le nom de celui dont on souhaite disposer*, et il se
charge d’installer le logiciel ainsi que tous les paquets qu’il nécessite.

Distribution Mise à jour Installation


Debian, Ubuntu apt-get update apt-get install paquet
Gentoo emerge --sync emerge paquet
Arch Linux (non nécessaire) pacman -S paquet
Fink fink selfupdate fink install paquet
MacPorts port selfupdate port install paquet
Fedora, RedHat (non nécessaire) _ yum install paquet
Parfois, quand le logiciel n’est pas distribué officiellement, il existe néan­
moins des dépôts officieux maintenus par les développeurs du programme*.

.… et sans
Parfois, un logiciel dont on a besoin n’est pas disponible sous forme de
paquets pour notre distribution ; il faut donc l’installer à partir du code source.
Il n’y a pas de recette générale qui fonctionne systématiquement pour ce faire,
mais beaucoup de logiciels s’installent selon le modèle suivant®. Après avoir ré­
cupéré le code source sous forme d’archive .tar.gz ou .tar .bz2 sur la page
de téléchargement du programme; il faut lancer les étapes suivantes :
% tar xvzf archive.tar.gz Extraction des fichiers source
k cd le_repertoire_cree
% -/configure Détection du watériel et des bibliothèques nécessaires
% make && make install Compilation et installation
Parfois, le script ./configure se plaint qu’il manque des bibliothèques ;
cherchez les fichiers de développement de ces bibliothèques par la procédure
décrite page 69 et installez le paquet correspondant. D’autres fois, l’installa­
tion ne fonctionne pas du tout de cette manière ; cherchez alors des fichiers
README ou INSTALL pour obtenir des instructions précises. Il convient de pré­
ciser qu’installer manuellement n’a quasiment que des désavantages, et que
cette méthode est réservée aux cas où il n’existe pas de paquets pour le logi­
ciel qui vous intéresse.

Fink et MacPorts
Sous Mac OS X, il n’y a pas de gestionnaire de paquet installé par dé­
faut mais deux projets ont vu le jour pour permettre l’accès aux diverses
3. On aura par exemple trouvé son nom grâce aux commandes détaillées page 69.
4. Pour Debian/Ubuntu, un grand nombre de ces dépôts officieux sont disponibles depuis la
page launchpad.net/ubuntu/+ppas.
5. Connu sous le doux nom d’automake/autoconf.
164 INSTALLATION DE PROGRAMMES
richesses du monde Unix: Fink et MacPorts. Ils sont tous les deux active­
ment développés et remplissent les mêmes fonctions dans la plupart des cas.
Seul le degré de maturité des paquets mis à disposition peut varier de l’un
à l’autre, les méthodes de sélection étant a priori différentes. Dans les deux
cas, vous avez besoin des « XCode Developper Tools », qui permettent de com­
piler de manière transparente les programmes non disponibles dans un for­
mat binaire. Si vous disposez encore des CD d’installation fournis avec votre
Mac, vous les trouverez dessus. Sinon, ils sont disponibles en téléchargement
depuis l’adresse developer .apple.com/technologies/xcode.html après
vous être enregistré (gratuitement) comme développeur Apple (developer.
apple.com/programs/register/).
Pour installer Fink, téléchargez sur www.finkproject.org/download/
la version qui correspond à votre système d’exploitation et votre processeur
(vérifiez au besoin dans le menu Pomme : « À propos de ce Mac »). Il ne reste
qu’à suivre les instructions correspondantes. En fin d’installation, Fink modi­
fie vos fichiers de configuration de sorte que la commande soit directement
accessible via un terminal. Si ce n’est pas le cas, c’est-à-dire si lancer la com­
mande fink vous donne une erreur du type « command not found », vous
devrez rajouter « à la main » dans le fichier de configuration de votre shell la
commande
[ -r /sw/bin/init.sh ] & . /sw/bin/init.sh
Cela devrait rendre tous les programmes installé par fink (ainsi que fink
lui-même) accessibles depuis vos terminaux.
Pour installer MacPorts, rendez-vous sur la page www.macports.org/
install .php, choisissez la version qui correspond à votre système et laissez­
vous guider. MacPorts devrait aussi mettre à jour automatiquement certaines
variables comme le PATH ; sinon, vous pouvez le faire vous-même en ajoutant
les lignes
export PATH=/opt/1ocal/bin:/opt/1ocal/sbin:$PATH
export- MANPATH=/opt/1ocal/share/man : $MANPATH
dans le fichier de configuration de votre shell. Cela devrait rendre tous les
programmes installés par port (ainsi que port lui-même) accessibles dans
vos terminaux.
Dans les deux cas, vous devrez avoir accès à un compte administrateur de
la machine“.

6. Il est fortement déconseillé d’activer root sur Mac OS X: mieux vaut s’en tenir à utiliser
les comptes administrateurs, comme le tout premier compte créé sur la machine. Pour cette
raison, on utilise toujours la commande sudo plutôt que su.
Lexique

Ce lexique regroupe des explications sur tous les termes techniques ren­
contrés dans cet ouvrage. Au fil du texte, nous avons signalé les mots présents
ici au moyen de PETITES CAPITALES. Nous conservons cette convention dans les
définitions.

Alias: raccourci pour une commande, éventuellement munie d’orTIONs et


d’ARGUMENTS, défini par l’utilisateur. On le définit dans le FICHIER DE CONFI­
GURATION DU SHELL. Voir aussi p. 95
Archive : manière de regrouper plusieurs fichiers et répertoires en un fichier
unique, généralement compressé, pour en faciliter l’échange ou la sauvegarde.
Voir aussi p. 60

Arguments : liste d’objets (généralement des fichiers) séparés par des espaces
sur lesquels une commande doit travailler. Voir aussi p. 19
Autorisations: une série de permissions associées à un fichier ou à un ré­
pertoire (lecture, écriture, exécution), sur lesquelles le système d’exploitation
se base pour autoriser ou refuser l’accès à un utilisateur. Voir aussi p. 48
Bash : le sHELL le plus couramment utilisé, successeur de sh ; c’est l’archétype
du shell « Bourne ». C’est l’abréviation de Bourne again shell. Voir aussi p. 160
Binaire : voir FICHIER BINAIRE.

Caractères spéciaux : caractères qui ont une signification particulière pour


une commande. Voir aussi p. 20
le sHELL et qui doivent être ÉcHaAPPÉS si l’on souhaite les utiliser tels quels dans

Chaîne de caractères : données textuelles, sous forme d’une série de carac­


tères. C’est ce que contiennent les VARIABLES.

Chemin absolu : chemin vers un fichier ou répertoire repéré par rapport à la


racine ; il commence par /. On parle aussi de CHEMIN COMPLET. Voir aussi p. 21
Chemin complet : synonyme de CHEMIN ABSOLU.
Chemin relatif : chemin d’un fichier ou répertoire repéré par rapport au rÉ­
PERTOIRE COURANT ; il ne commence pas par /. Voir aussi p. 22
Commentaire : ligne commençant par un dièse (#) dans un FICHIER DE CONFI­
GURATION DU SHELL OU UN SCRIPT, qui est ignorée par le shell et qui permet de
documenter ce qui suit. Voir aussi p. 105
166 LEXIQUE
Console : voir TERMINAL.

Crontab : fichier de configuration de cron(1) qui contient une liste de tâches


de ces tâches. Voir aussi p. 86
à effectuer périodiquement. On utilise parfois CRONTAB pour désigner l’une

Dossier : voir RÉPERTOIRE.

Échapper : faire précéder un CARACTÈRE sPÉCIAL du caractère d’échappement,


« \ », pour l’utiliser tel quel dans une commande. Voir aussi p. 20
Encodage : synonyme de JEU DE CARACTÈRES.
Entrée standard: canal de communication utilisé par défaut par un pro­
gramme pour lire des informations. Il s’agit en général du clavier, sauf si l’on
utilise des REDIRECTIONS ou des PIPES. Voir aussi p. 112
Exécutable : synonyme de FICHIER EXÉCUTABLE.
Fichier binaire : fichier dont les données brutes sont illisibles par un œil hu­
main, par opposition aux FICHIERS TEXTE. Voir aussi p. 28
Fichier caché: fichier dont le nom commence par un point, que les pro­
guration. Voir aussi p. 19
grammes ignorent le plus souvent. Ils servent souvent de fichiers de confi­

Fichier de configuration du shell: scriPT exécuté automatiquement au


démarrage du shell, ce qui permet par exemple d’y définir des ALIAs et des va­
RIABLES D’ENVIRONNEMENT. Pour bash, il s’agit de -/ . bashrc. Voir aussi p. 104

UN SCRIPT. Voir aussi p. 49


Fichier exécutable : fichier que l’on a la permission d’exécuter, par exemple

Fichier texte : fichier lisible et éditable « à la main » par un être humain, par
opposition aux FICHIERS BINAIRES. Un fichier texte ne représente pas forcément

en CSV etc. Voir aussi p. 28


un document textuel: il peut contenir un programme, une feuille de calcul

Filtre : programme pouvant travailler sur son entrée standard, que l’on peut
combiner avec d’autres pour réaliser des tâches complexes. Voir aussi p. 116
Glob: motif permettant de spécifier plusieurs noms de fichiers en une seule
fois à l’aide de soxErs. Ils sont décrits en détail dans la page de man glob(7).
Voir aussi p. 126
Home: répertoire principal d’un utilisateur. C’est normalement le seul dans
lequel il a le droit d’écrire. Il est souvent de la forme /home/vf, où vf est
le LOGIN de l’utilisateur. Voir aussi p. 22
Invite : texte court affiché par le shell pour vous inviter à entrer une com­
mande. On peut configurer son apparence. Voir aussi p. 106
Interpréteur de commande : voir SHELL.
LEXIQUE 167
l’écran. Voir aussi p. 102
Jeu de caractères: convention permettant de représenter les caractères à

Joker: un ou plusieurs caractères permettant de remplacer une partie d’un


nom de fichier. Le plus utilisé est *. Les motifs utilisant des jokers sont appelés
des GLOBs.

Lien symbolique : fichier spécial qui représente un chemin vers un autre


fichier ou répertoire. Il permet d’utiliser un fichier sous plusieurs noms.
Voir aussi p. 47

Locale : langue, pays et JEU DE CARACTÈRES favoris de l’utilisateur. On les mo­

variables en LC_. Voir aussi p. 102


difie par le biais des VARIABLES D’ENVIRONNEMENT LANG, LC_ALL et les autres

Logiciels libres: logiciels dont la licence permet à tout un chacun de les


libres. Voir aussi p. 15
modifier et de les redistribuer. Tous les logiciels présentés dans ce livre sont

Login : nom d’utilisateur, souvent court et en minuscules. C’est aussi le nom


du répertoire HOME de l’utilisateur.
Non-interactif : se dit d’un shell qui interprète un scRIPT, car il n’interagit
pas directement avec vous. Il ne lit pas les fichiers de configuration habituels.
Voir aussi p. 138

Page de man: documentation des programmes, accessible depuis la ligne


de commande à l’aide de la commande man. Le premier réflexe quand on
se pose une question sur un programme est de consulter sa page de man.
Voir aussi p. 39

Paramètres positionnels : arguments d’un scRiPT, tels qu’ils sont manipulés


par son auteur. On y accède via les VARIABLES $1, $2, etc. Voir aussi p. 141
Permissions : voir AUTORISATIONS.

Pipe : connexion entre la SORTIE STANDARD d’un programme et l’ENTRÉE STAN­


DARD d’un autre, représentée par une barre verticale |. Voir aussi p. 115
Programme : FICHIER EXÉCUTABLE que l’on utilise en tant que commande.

Prompt : nom anglais de l’INVITE.

Option : forme spéciale d’ARGUMENT qui commence par un tiret et qui modifie
le comportement de la commande. Voir aussi p. 19
Racine : répertoire le plus haut dans l’arborescence du système de fichiers. On
le représente par /. Voir aussi p. 21
Redirection : construction du shell qui permet de rediriger les entrées/sorties
des programmes vers ou depuis des fichiers. Voir aussi p. 111
168 LEXIQUE
Répertoire : un objet dans le système de fichiers qui peut contenir des fichiers
ou d’autres répertoires ; on dit aussi « dossier ». Voir aussi p. 21
Répertoire courant : RÉPERTOIRE « dans lequel on se trouve ». C’est celui par
rapport auquel sont repérés les CHEMINS RELATIFS. Voir aussi p. 22
Script: petit programme écrit en langage interprété, comme celui du shell ;
dans ce cas, on parle de « script shell ». Voir aussi p. 137
Shebang : première ligne d’un scRiPT, qui indique le programme en charge
de l’interpréter. Pour un script shell, il s’agit souvent de #! /bin/sh.
Voir aussi p. 138

Shell : programme au centre de la ligne de commande : c’est lui qui se charge


d’interpréter les commandes de l’utilisateur. Exemples : BASH, ZSH, TCSH.
Voir aussi p. 17
Sortie standard : canal de communication utilisé par défaut pour qu’un pro­
gramme affiche des informations. Il s’agit en général de l’écran, sauf si l’on
utilise une REDIRECTION OU UN PIPE. Voir aussi p. 113
Super-utilisateur : utilisateur spécial de l’ordinateur, nommé root, qui a le
droit d’effectuer des opérations d’administration de la machine, notamment
installer des programmes. Voir aussi p. 162
Symlink : nom anglais des LIENS SYMBOLIQUES.
Tcsh: SHELL de type « C» couramment utilisé et réputé pour sa sécurité.
Voir aussi p. 160
Terminal : logiciel permettant d’interagir avec un programme fonctionnant
en « mode texte », par exemple un sHELL, depuis un environnement graphique.
C’est l’abréviation d’« émulateur de terminal ». Voir aussi p. 17
Variable : CHAÎNE DE CARACTÈRES que l’on peut manipuler dans le shell ; on
s’en sert surtout dans les scRIPTS. Voir aussi p. 139
Variable d'environnement : forme spéciale de VARIABLE qui est « exportée »,
c’est-à-dire rendue accessible aux programmes lancés par le shell. Ces va­
la LOCALE. Voir aussi p. 99
riables servent à configurer certains aspects de la ligne de commande, comme

Zsh : sHELL de type « Bourne » couramment utilisé, particulièrement réputé


pour son extensibilité et pour un nombre de fonctionnalités impressionnant.
Il intègre aussi quelques aspects des shells « C ». Voir aussi p. 160
LS 125
HH L en e se se n ns s su se s00e se 0s a 0n c000 143
es srr e sn en en n e en n nn ns se ns n e e 144
\commande ...c se easa se ns na uun e 131

L E 141
$(C2 + 3#4)) ...c cccc ccs es se se 144

alias ... 98 E
Aet les141
$(commande) ...s 125
E O 18, 105, 141
115
T Lacase ns se us se e sn en e se en en e ue ns se n s0 s004 91
É La rs se se en e e ec ce se ns c es se nn 000 84, 125

([4 E63
{jpeg,png} .......….….........2reccecunuss 127
| Lecsecec cec se r e ne ce n ec ce se se ccn u00 115

GO L en es scc en e es e en e e cc es a ce 00e 142


$laÿ#b} ........scee cec nan cccc ccn 00s 143
72 PS 113
AVEC CAS@ ... se se ce ce en cnc 0n ce 149

QIHL L s. es cs e sn en ne n en ec nn en e un ns 113

c21494 0) A E 143
équivalent tcsh ..….….….....….….……….……………. 161 équivalent tesh..….....…....….….…..….………. 161

équivalent tcsh .........…...….…….….. 161


${prefix} ..........…ssraacssa ccn ue 140 153
23D Lees es a se c se e se se se e ne e e ns cn e en 0 un 113

2 PS 113
W ccs sn és a se se se ne ns en e es sn nn ce e e 143
Ü cccc se es e es se se sc e se en re c se en a se u0000 93
HE c.s en se sn c sn e se n se ce sn e 00n 00 115, 148

3 L ss sn e e se se sn se se se e ce s00000 95, 106, 125


absolute path ..….…..……....…...rreascncuuss 21
adresse IP .......…...…..csecsnsa ns seues 77
Alias ...…..……ssesareeneeesae n se nna0e 85, 95
“/.alias ... .....ccsesssac ue 96, 101
dans les scripts ... 138
p3 PE 35, 126
PS 144
*

alpine ........…...secsorscsaseus ec 0 s00000 82


multiplication ... 144 BNACFON .....c0csassecsna ccrc u ne ns ce u000 87
** (glob zsh) ...….…........cccaeseeneaun en 161 APFOPOS .....00a0cocnenenanen000 40, 68, 159

— ccuuues PE 144 apt-cache search ......…..…..……….…. 69, 118


Apt-get ..…....…......censscenaeu se en e0000 43
fichiers commençant par ..….…..….……. 34 install ...….….….….…...…..ecsrsecccnece 163
OPtIONS .......242000 00000n a 00000000s 19 update ..….….…..…....sssssnssccencune 163
-- (fin des options) ... 34 Arch Linux ..…......….....sacssacneu se 69, 163

L A E 61
TTHEIP ...s cc sana se se se nsu cs s00000000 159 archive ..….….............esacraa en sc se n nn 60
--VEIDOSE ...c s000 ssces c00e n nc 00000000 61 ASCIL Ls crcs cs en en e en e ce nn nn en ue nn 102
TB Lc sess es e se se ce se ce sn se ns 00000000 159 ASpell ...….….…..ussssssersen se cec ec nenu00s 100
At L..cscsecsan se en sc ccn nn ce uus 88, 92, 153
-VErbOSE .......s20 se 0s 000e se 00ec 00s 000n 00 61 ATG ........12ee cccc aa ns se nen ms 00ec c000000 88
. (répertoire courant) ..…....….....……………. 23 ATÉM ... 00s sa se ec se e e 0 en se anan en e se nn es 88
. (syn. de source) ..….......….….….….….….….….………. 155 AUTOCONÉ .....0scassse se n en e cec se ce ue n 163

L 112
.. (répertoire parent) ..........….….……….…... 23 automake ..…..….….….….........eecenencaneune 163
dessnanse se sn sn sn 00e se ns nn en e se c000e 144 autorisations ..........…....…….….…….……….… 24, 49
/etc/bash.bashre ..….….…..…....…….….….….….….... 96
/etc/profile ..….…..…..…..….….…….….….….….neuess 96 basename .......….….….….….……esscecuces 131, 143
F eeras se es se ne c en se u0 s00 ce n s000000 114, 115 bash(1) ........secse ns ce n se ue n se uun es 41
-/.bashre ..…..….….……. 96, 100, 104, 149, 160
C< Lesssassssen ns es es ce ns ns cu ce e n e c00e es 112 DE ..ccccces ce ue en es n ce se nea se e na ue cn 000 93
E Léccssseencea se sn sc e es en se ccc a c0000 139 binaire ..….….….…..…....….…….…………. voir fichier binaire
F orccasesea es s0 e se n se ns se n se ce se se e 111 boucles ...s cneuss 150-153
DE L ce es en ec 0s sc e se se ns en en se ce se nc e 161 BOUME .....cssse cs aa se se nc sn nn 00000 160
DF Lesessssane se se sc en e 000s en en se c0000000 112 built-in ...c cs cnc ue voir shell built-in
DI Leccccssse se se ec ce se ce ns en ns en c000e 112 DUNzip2 ...…....sccsnsse se se e se ucrc 0e00e 60
[e.cccesreseen cec cs en nc se nn rrn cn e cv 00 146 DZCAL .....0s00sssee se nn nc e ne sr nn e se c0000 60
\ cssessaasa ns c se ec c0 nasre c00e n re cccc 000s 20 DZip2 ......sscssocseccenneeca ccn en 0000000 59
170 INDEX
ELtAT L......cseccna cnc ccn ce e nn neu se 61 /dev/stdin, stdout, stderr ..…..…..……. 120
[2 CC R 60 Device..............crscerensascensanss 54
dÉ L....ssa0csoscesse cn ce ue en ucc en cn 00000 53
(— R 84 dIFf LL.eLLesscnsscceesecenereso u00e 55, 133
calendar ...…..….….…….…..…sssesssessas0c00re 153 TU .cn ceccsensca c000e nc 0s n 0 se sa 0008 55
caractère d’échappement ...........…....…. 20 dircolors..….............….…cccssens 104, 107
caractères spéciaux ..…..…….……………….……………. 20,125 dirname ....…..…..….….…..….….…cesecseeueuse 143
( 7 148 diSOUn .......ccccoccseses se n ec 0000s 93, 94
casse des caractères ..….….…………….….……..…..….….….….s 18 $DISPLAY L......2c00ca 00000c se a e ns cuu 00s 74
CAT L....enasosaecannsevn000 59, 76, 112,118 display ................0eccercnceuss 65, 74
TN Leseccecanccanca ccn se n recneven e 117 display all 2141 possibilities? ... 42
CÂ L.sanossoscasenu s00e ns e 0n s00400000 23,98 dO ..........scesosronan en ec c nne c veanes 150
CÂ —— ...ccsa0oensaros en sn 00000s se 00n c006 24 GdON® .......….....ovsocereneanencanenees 150
cdrecord ..….….….….….…..…..…sseca sn en nn cuu n 98 dossier ..….….….…..........…cssacssaneranau un e 18
chaîne de caractères ... 54,139 duU......ccocrorrrrsrenece0ces 53, 95, 123
chemin (absolu, complet, relatif) .… 21,22 dvips .......…..….…..ecsenrrccseanues 114, 137
et ln -S L.......c0sesna s00e se 00s 0000 48 TO Senseassosssenee se nn ae se nc cavee 120
CHEYP c...c sensanen se se ue ccn su en e cn unane 52
CHMOd ........02c 00ec se c0 se ce nc a c0 ce u0000 51 échapper....…..….............ceensee 20, 125
( 25 100 guillemets ... …… 125
CHOWN .......2. s20 s00 0se cn se cn nc a ccn 00000 52 expressions régulières ...…....….……. 129

clé (SSH) L........sa es ce en n ec e se rn0u0 n 75 EChO .......…..…...eecenccccuue 18, 37, 99, 158
Cl@aT ......eucscen ec e ns e se se ns enaacnau 00 98 $EDITOR ............ce ccc cn c000005 86, 99
command not found ... 19,20,101 egrep ..…...…..…...….….….….…..…cccescunuee 127, 129
commentaires ..…..…..…...…..….….…….…..….… 105,138 elif .............encconrensrnens se ennuus 146
comparer deux fichiers ..…..…....…....…….... 55 elinks................csseenccssenaesee 82
confirmation ClSE ...c csa0cacsea0sec se cm0c na cnc eun 00 145
CP ...0scscocssocsan cec nn ue ne ce nen006 33 emacs ....…...…...sercrense 2, 30, 74, 93, 99
MV L..ccsoseenene rc en se nee se ccn 0000 32 SEMAIL ........ccsecseue sn ce sn rn 00s 99, 149
KM Lescssrsennenersecesse ccc nc0 e S, DÛ EMEXGE .L..L.L L e se en ec ne n ce ns nn encvn0 e 163
convert ...….….….…..…..…... 11, 63, 122, 127, 158 TSYNC L..sssssn0se rc es n se e e nenene 163
"dENSItTY 8.00c se0res se ce ns ne s00e 64 TS Lerseccansene nn ce ns ec se s0 cec sn0000 69
-YESIZE .....000scanso nc cna0 c000000 64 entrée standard ...s 116
TUYiM L...00.0 000ec sa 0000n cec c00000 64 ENV ... ….crocsescrennescarmne nn neunes 100
et les globs ..…......……….….….…………… 64,152 epstopdf ...….…........….…...ecssnensen e 65
fichiers PDF ........122000000000 e 64,152 @ESAC ...c ccsa ccc ccn u en en es sn sn na ue 148
couleurs ..…............…....cceenseuces 107 /etc/passwd ......….......……sseccances 118
L 11, 32, 124, 126 evince.….......….…...sscenessss ds se cs cn se 59
A, -P -IR ....cccsrasecranene ce sena 00 33 exécution conditionnelle
VÜ Lesc se n scrc ese scc ce 0n c0005 voirmv —i UE ..s e se es ns su se en se ns en e 00000 115
-E Leccssacen se c0c 00n cs s0 0a00 0 11, 124 | 115
à distance ..….….….….…..…..….…...…eonserseenee 77 CASEE@SAC c...0csec cec un cccc cu 00 148
CPp1252 L....cccsasancesera nn ena en seuses 103 DfLLÉi cccc ucse se na c c000 se se 000000 145
CYON L.)uscsenessaosoenanc sc e neeno00s 86,153 exif ...........ncesecneneruessenencanuu ue 55
CYONTAD ........000sssoreesensana ce nneu se 86 exim, exim4 ....…....…....sccnersssenereues 83
CSÛ ...c sascossa ce se en e 0 ranosa0 s000000 160 exit ............ecseenecse cc nnansenvause 74
CUFÏ ......000000ssona u00 000es s0 en me s000 82 exiv2....….…....coconececencss nevune …… 55
-0,-F L.ccccassacuune mosvassausau0s 82 EXport ...…....nosssessansansonne ce 100, 160
CUE L.s0sscsrs se rene0v0e 118, 123, 124, 153 expressions régulières ......…..…..……. » 127-134
CYGWIN ...s 2e cec e n en ce ra c nn e me en 000e 15
Fedora ...….….....…csecsscena ue uus e 69, 163
date ... 83, 98, 104,125 fetchmail ...n se ce ce asa0u se 83
Debian .......…....enscesseucs 43, 69,163 fZ —…..........ccsseneec se scc ns en anann en 93
Ÿ e à A 49 fgrep .….…...........…..…rnsensnse 129, 153
/dev/null .....…....esese cec se sc recn 00e 114 fi ..esvecsserencenmesve scrc ce cn na 00 145
INDEX 171
fichier graver UN CD ......….…..csssensrsssancuse 98
DZZ ...c cereseena0 cs se cec nn e na nn c0 60 grep...…..…..…..….….….….….….….…. 57—59, 116, 124, 129
EZ s.ccucccneesaa nn ccs a en ccn nc 0000 60 --COlor=auto ..…..….…......….….….….. 97, 108
1ZMA .....20000 00s n an cccc cec s000e 60 -1, -à, —F ......…acssssaacs c00000 58-59
attributs ..................eueuse 25 -A,-B .......ccscssosonsancasnauces 130
commençant par — ..….….….…............. 34 -E Lecnsccunecenanenesena cec e ns ccn 00 127
de configuration ..…...….….…..….…...…..….. 95 Ü Leccssessssa e se scc a 00s 000000 58, 124
exécutable ...........…...….….... 50, 101 1 Lese ce cec en nn cnc nn 0000 58, 119, 153
lecture seule ... 51 TM ...csceccseseenare ce se se se 000 117
PriVÉ .......2ccocsan ce nc sc n ce n e c00000 51 TO secnssssserseun scc ec us sen sc u0000 131
fichier binaire ... 28, 59 TV Leccrecere se crcn e ne cn en m0 0 58, 124
extraire du texte ....….…........…..….…. 54 gr OÉÉ .........cca0e0os c00e 0 se ns s000e 00008 41
GTOP .....0000cccceca se ccn ccn raree e 58 groupe d’utilisateurs ..…..........….....…... 48
terminal ...s ancnnes 59 Groups .….………...….….…...ecorcecc sc es se nencen0 00 49
fichier texte ..….…............…eccensese 28 guillemets
différences entre deux fichiers …… 55 doubles ...............0.00000se00e0es 125
éditer .…..….......….….….secceseensau0e 30 Inversés ...…..….........…uecceus 84, 125
statistiques ... 54 simples .......ssussecsecssensens 125
FÂlE L.ucccsecsenccenc en ne ccrcc c000e 27,124 GUNZIP .....0.0000e0 ec se ce en ce es e c00000 59
2 Lc nl a e nn nn nn D7 OEV c.…02ccccsec cc ne ec se se c0 ce cec e se c00000 59

find …. 11, 38, 115, 120, 123-125 L E 120


jeux de caractère ..…......…....….….…. 103 GZiPp ...…...........ecsecceec en cccc ce 00000 59

PL ec e ane se n e se se ns se ec ec se 57 ELTAF ...20000 00ec cec cccc ce c00 c00e 60


-ÎNAmEe ..........…ossaccscncseucu0r 38
_mmin ...s 57 head.............ecsecssccecnsccceess 117
-mtime ;c 57 historique d’une session shell ... 95
-name ...c 38, 126 $HOME .......2 022 0a ce ec se se se nn en e se 00000 99
_never ..….…….….uccec e en 57 home ..….....…......esrsssccassana scc s0000 22
-gige ...c en 57 CÂ L.ccnsensesnec se ns e nea ccn nc ncu0 00 24
HYPO ... .cccrccsccsserserrercerce 57 NOSTNAME ... 100es se ns as n s000000 149
ELXATGS ...c scce se nc cec 000000 121
fink }
cecÂQ
69, 163, 164 ÎCONV ...2.000000000
L......c00sassonana cs en e00ns0000s se nn
0s cs en 0 en 00162
c000000 103
install ...….…........…….0osssoscnsu0s 163
. dÉ L....c se 0ee e 0n en e 0000000n 00000 105, 145
VÂSt ...c sscenc cu ce se ce nn ccn 0 69 ifconfig ... 77
selfupdate ....….......….….…….…...…. 163 image S
e ÎTMAP .....22
tcsh ...00s
161s000 se n en ce n 00c a0 00 67
ÉOT LeL..2 2 ce en e ne e 0s s00 ce se ce ns 152, 158 b
équivalent vectorielle ....................... 67
foreach .........….….….….…ncsseneneanecnuse 161 ImageMagick ……n 63
fr_FR ........esceseasac ccn 0 cs ce ncu ns 102 .INÉO L.....ccccscaas0 0s s0 se 0 u0 n 00000000 159
ÉTOM ........2ee cc 0 se sa n nc cc ucc nc cn cu rc e 117 Inode ……c e en 54
ÉTP ...cnccsccasscan ccn n ce nc e ne nn s0000000 79 interpréteur de commandes …… 11,15
ATONYME ce2ncce r ec ceccen en teneecccen 80 invite ….…...cccccccrscece crrr nene 17, 106
fullpath....…......….ussseesseecenea cn es 21 pash ….c 160
TCSN ....cccosecos sc cu nn es m0n 000000 160
GentoO0 ....….….....…..00sscsean ccn 000e 69, 163 zsh..…..….………cicne 160
gestionnaire de paquet .................. 162 iS088591 ...c acossosaocnnsassa u00000 102
}4 (e) » PE 36, 126
GEtOPtS ... ecnearca n a ce 00000000 151 âspell .............cscersarenenenen ue 99
H Lesssceennenesensen se ce ue ccn 35,126 jobs ........ccnsncanacca nc en ccn 00e 93, 94
S 126 joker..….............rercesecanec cn cc en 35
[O-7] L........ scc ce ns sn s0m suu 126
[aFO] L.........ccc cnc anaa scc encee 126 Kill ...........00000co0essasscacas s00000 93
[e-f] ........ e cec e ce se e scc sa0 00e 126 -KILL ......ssosossoesossennsan0a0s0 94
et convert ...….….…....….…….…….….….….. 64, 152 41 (numéro de tâche) ..…......….…..…. 93
gnome-terminal ... 103 7404 (PID) .....….…...00sassessasau es 94
172 INDEX
Killall .........uecceene se e nenenn000 94 MacPorts ...s 69, 163, 164
Konsole ....…..….….….….....……essencrnes 17,103 mail......…...…...….…....escssenuse 92, 112, 125
KSh .......ececeec n es nc ns nn nn en n nn uus 160 majuscules ….…..........csccsccscc nn 18
KtErm ...….…......seeceneracnen ce ec n 0000 103 man .......…...…..….…..eecsecenesauas0ee 39, 159
-TPS ..scsnssc se se se ue n se ccn 000s 142
$LANG .....L. 2L e en e cn en en e nc nau 0 e 99, 102 PDF ......c0cccseeuccenenecensanss 142
langues ..…..........…eccccseece nc s0 00000 20 $MANPATH ... ce se cn se se cn e c sn 000e 164
latex ...c 2,114, 131,137 Minuscules ...........c0ssassscc cc cec en se 18
latin-1 ...c 102 mkdir .........…...0cscceccenesne cccc s000 31
$LC_ALL Lc ne cs se n ec cec es 104 montage ...…...…...........1e0cseesenacu0es 65
$LC_MESSAGES ...c 104 MOF@ ....….....cccsc0socese es se ccn e000e 29, 98
$LC_MONETARY ... 104 Mmplayer ............sscccecessscnenau0ee 98
$LC_NUMERIC ...........222ccccc cnc nn 104 MUtt ..........ccccaccassecema 000000000000 82
$LC_PAPER ..........222ccsscee cccc nn 104 MV ........cceccenesraasene scc ccn nana0u 06 32
$LCLTIME ...c cccc n cs nn sc cn ce 104 TÂ ceeecereence ns ec cccc cnc cec 32
less ... 29, 115, 116 MV(1) L.L.Le n en e ce es e e e e e e se se sn en e 41
-L Lecsceeseee cec n ec es n e cec nc ce 000 30
-PYf--W1b/4L ...c 97 TM@NO .......02000 cccc us cec se c00e 30, 99, 109
R eccscccc ccrcc crr en asa en nn en 95 4D cecceee cccc eee cnc enee cn seccee0s 74
d L 97 TCAL s..2000ccecccece ce cec ec sc n cec s cec ne e 84
entrée standard …. 116 1;Ïftp ................................... 1îî
v p 39P MMU
recherche ... CATY f Àfile
30 no such L1nn110
or directory00 4
... 23
lÉtp .…......nccccccncee. 79, 81, 104, 108 nohup ......…. prereeteraeesees se en eeee 94
libreoffice ..….…......sssccacseune 9g OM de la machine ... 149
lien symbolique …… 47, 72 not a directory ...s 23
‘déréférencer """""""""""" 62 OOffice .........cseesu nn ce nn en ec 0000n 98
FSYMC vececeee ec en en en eteteeeeneeee 78 GOPTARG ... cccc cccc 152
SUIVTE en cec ce ce ec ec cec e tc e en cec 62 (e) 97 (e) » W 19
TAL ......…000ccec0ca se ce 0s s000 u00000 62 bundling ............................ 25
In -8 .......cecseccen e se cn en en ec e cn 00n 000 47 fin des options …… 34
lo<ïate ........................ 37, 116, 159 groupage .… 25
log1n ..................................... 23 Îl'lt€l‘pl‘étflfi0fi des OPÏÎOHS .......... 151
$LOGNAME ..........crcssecscessecsce0se 99 plus d'informations …… 61
lp ...................................... 152 otphelin (lien) ___________________________ 48
18 L.... L se cne e 0n e ec es en se 0 ce e 00e 18, 104
TTCOÏOF c.ccccsessecc cccc s000e 97,107 package manager .… 162
L E 97 --search ...c saecuaues 69
TF Lecccssessacae se se ce ce s0000 0s 23,47 pacman -8 .......ccscssecsccc scc nc nn 163

L 56 pages deman ..….….….….….….….….….….….….….….…. 39, 68


TA LLeccsecsesera se en e ce se cnc cc nn 000 19 CONVentions ..….........….….……..….….….…….….. 39
TO Leccsscaceseeu 0s se ucc e na e ce cn 000 25 sections ..…..….........….….scaccnnns 40, 69
PE 25 paramètres positionnels ............…...…. 141
-L ...c.ceec se cec en cec se c na0 0s 24, 47,56 $PATH L........ccuuuu us 20, 88, 99, 133, 164
-1rS .......2 es scc e se 000en e c0000000 56 PDF .........csssss ce ue se ce cnc cuu n 65-68
-1rt ...s ssecesaen es ccn e se nn 00e 56 MediaBox ... rccccucnns 58
TT Leeccerenesannensansansen cec 00000s 56 pdfCrop ..….…...….….….…...ccrseccensennes 67
H Ls ec se es ee nn e se se 00 u00 56,124 pdfimages ..….....….......sesnsennescu se 67
$LS_COLORS ...c cec e nc sc au0 99, 107 PDFjam ............serererene se ns n euna e 66
1341 PE 82 pdfnup .….…........….....secceccssececcuu0e 66
Tdump ...….….….......0nsesase cec cau000s 82 Ppdftk...............cccsecnssncacescen0e 65
1zcat ..….….…......csssnse nn en a 0000 60,116 pdftops .............…sseessa ns ce se nc e 65
«IZlesS» .......acoceenanenesenenene0e 116 Perd...........se cccc cn nn ce ns anen se 133, 134
1ZMA L......ccesece se scc en ec u0 ec sn se 00000 59 PiCO .......cssacsocs cs c se u se 00e en rn cn n0e 30
INDEX 173
PID ........c sr ec ccc en es se ncen se cna00 93, 94 s/pdf/jpg/ ...…............….….….….... 131
Ppipe ...….….….….….……….secassncnnencenenes 115-125 sendmail ..…..….….......scesersnnsancrnac00e 83
ELSSh ......22c0 se 0 ns ece sn neane c000 75 SEG ...c cesacsrsen ccn se nca cn s0000000 127
port SOÙ L.ccccssccnen ns cu n se ns cu ns a se ce n c0000 106
install ..........+e00esesonsonu000 163 TC Leccvensssonsne ns 0s s00000000 106, 138
SEAFCH .......0 c0000 e sencn se cs en cu 00 69 TX ce canan se se se se n se se ns s0 s0 00n 00 140
selfupdate ..….….…….….….….….….……sarssues 163 UCSH ...c ccc scc se n nc su cs c se c00000 161
} 015) D, GRR E 15 setenv ................enscrensane0ne0s 160
POSTÉiX ....…csccscccr scc cc ne nn en e 00000 83 SÉLP .….......scssasec se ns se se ns ce nru 00 81
process identifier ... 94 shebang ….….….….....…sssesssaa ns ns se ns se u00 138
“/.profile .............…csessseensee 104 $SHELL ...s ssssssa se sc su se 000 99, 100
Pprompt ...….……….….…...….……cscenasancanne ns 17,106 shell ... es ce e uu en ce n en en es cn nn 000 15
prompt (tesh) ........….….….….….…..00sseccauee 160 changer de shell ... 100
PS .....sa0ssonsoen en rs a ce ca se cn a cn ne u00e 94 de login ....….…...….….….….……ssces 104, 105
E % RR 106, 160 shell built-in ..….............…..ssaeus 41, 101
Dbash ....…..…....0censasen se u ce n en us 160 shift .........ccsocssss s0 ce ne cuc 0 es 150
ZSN c.cc sn a 000es us se 0n nc e se 00000 160 shuf.........….cocosssusas se se se ns ne 0s 118
Pps2pd£ ..….….……….….…….…….. 65, 120, 122, 137, 158 smarthost ..…..….........essrsneecneuu se 83
PSJOÏN .....20secsecs scc se en ec nn es 0 00000 67 SOIT ... 0000s cccc se nc nn u00 118, 123, 131
PSNUP .....200 ccc sn se n n ec nn ce ns cnc e cu eu ms 67 sortie standard ............…...…cusesuess 116
PSSElECE ....….…....s0esren se ce ns ccs rannne 67 Ssource ....…...….......eccsreere ec e se c0000 96
PWd L......ccecc ce nc rrn e sn nn en es 22 $SPELL .............recscsscsa se nc nn e0e 99
SSN c.. sa cec e se es se sn e ns en en us se nc e nane 73
FEAË L...s2 ce r seca es cnc ccn e ccn nc cs en a0 00 154 TX cccc se su e sn e en se ce nc sn e sn ec u0000 75
readlink ...…...........ssssssenrecncesees 48 ( RE E 75
RedHat ...….….….......0cecensae n su 00005 69, 163 réseau local ... 77
TEdireCtioNn ...….….…......10sccssac se n se e nn e 111 ssh-add ...…........rossesssnssaanseu es 76
remove write-protected regular file? ... 50 standard input, output, error .… 113
TENAME ...c s2e s000 c0 00n 00000 11,122,133 sStat .…......…....csoesenanens ccs se s000000 53
TD Ls csccosse sn ce scc 00000000 134,158 stdin, stdout, stderr .......….....…... 113
répertoire ..….….….….…….….….….…...senssaneesrenna ns 18 Strings ..….…….…..…sessersasencrsn 0 54, 116
COUFANL ....0.000 se c0 srr se nc ccn ca0 00 22 BU .....cccsres se e rrs nn cnc se n se se se 0000 162
parent ...….….….….….….….…...sesencrenceunen 24 Subject: ............sucssesenan en se00e 130
PriVÉ ...s s0 an es 0 ns c0 s000 uc nn 00s 157 R =) 6 e E 162
TOSOÙ ......0 es o ue ne ns re e cu ec se s00000000 59 super-utilisateur ...............…. 50, 87, 162
TeVerse engineering ... 111000s 28 symlink..…....…..….….………. voir lien symbolique
IM L..cscsesssa ns en en es se so se se se c se c00e 33 système de fichiers ... 54
R L..cssescssnaau scc cu ns se ne se ccc nn 34
T Lesccaanese en se en s0 nn cn nn 000e 33,50 tac......…....scsssac ec en en cn rrn n c0000 118
À Ls se es ce sn e se 0n a n 000000 voirmv -i tâches de fond .................…..... 92-95
L S 87 tail....…......….rccccsscecnree 117, 123, 124
répertoires ..….….….….….….….….….……sssseceuces 34 tar ..….…....ccccecscecccu00e 60, 98, 112, 120
IMAiT ... 222000000000 en ce sn cec e se nan es 34 --exclude ... 60
TOOT ...s ss0 s000 sn sna cs e ns ccn 0c nn se 50, 162 I Les cccc es en se en es en es sc c00000000 61

L E EE 62
TSYNC Leccscas ce n se e se nn ce n en ce n ec 000 78 -T Lecssresere nn r se ce se n se cn n cec 000 120
-a, -L, -V .....200ss se s se nn se n se nc se 78 TCVZÉ ...c ce se se se e nn se n nn se 0000 60

SCP s..cssacsan se sn ec sn nc se ns e ce 0000 77, 112 CVJÉ L..cccsec se s se c sn ce 0n es e cc ne0 00 61


T oar 13 RR PE 95 CVZÉ S.c scc c se es se en se en en se ns se en se 60
journal d’un session ..….……...…….…..……….. 95 filtre ... cesca cs es en se ce n su 00es 120
SCFIPt .....2 02000000 a cn un se nc e u000e 104, 137 EVZÉ ... 22e sn en e se nn sn n en 00n e 62
ET-Te RE 122, 131, 161 KVZÉ L2cssas se s se en s0 ns c0 na 0000 61, 163
E Lesssosscssecen en se ns ce nc se 00ec 00 132 tcsh......….….…..esenseses se en es sr n0an 00 160
-i.baKk ...........00cocssaccsansu0s 133 -/.tCShTC ......e.ss0 ccs sn s00000 104, 160
TY Lesssase ns n es se ns en cu se s000000 132 tee ....…...…..scccaccarnsennan se ce ns su 00 120
174 INDEX
telnet ...........…...……ssesssosan s0000000 73 -P2 .....ssssa ce ce s00 s0 0s 0000 ne 0000 123
test.............sscecene sc en c00000 146, 148 XCode Developper Tools ......….....…..…..…. 164
texte ..…..…..…..….….……………se0e0se voir fichier texte _ xdvi ....….......…..…..ssrssseenceunene 93, 114
then .........….….…..…esenersenensencoue00 145 Xli .....…sssocosessues se cec o ce n0 0000000 65
TÎME ......0cc ccrcc sc cec nc n ce cec cccc c c0m0 85 xloadimage ..............….asescasanuce 65
TOUCH .......22 0n 0 00e se ns c 00n 00 31, 126,142 xterm.......…......…ccreccunees 17, 75, 103
tree ..........…..…rssensassans0000 104, 108 — 75
TUYAU ......222 000000n 0 00 s00 cec c0 c0000000 115 256 couleurs ... 108
TYP@ .......cccausccn se nn c00000 41, 96, 160 ELW3M ...c caass0cce se sson 000e 82
E A E 104 XV ......csccnoercceeneenaeneeena c na ce u000 65
XZ cecssucncsenenane we ns se n en en e nc nn n en c000 59
Ubuntu....…..….…..….……....….…. 43, 69, 162, 163 Ettar ......…......ecssseecceneseenece 61
UMASÉ .......000 00000c nae ns 00n 00e se un nvu00 52
unable to open X server ...….….….…………………………. 74 Youhavenewmail ...s 83
UNAliAS .........ocssanneca cec c000e 33,96 yum
UNIG ........00secsr0cc0s 119, 123, 131, 153 install ....….….….….…….…srsennenevnes 163
Unix ...s se0enseensa nn nc e c0 sa000 15 SEAFrCh ........0.cacacncenene0e0nn00 69
Unlzma .....…..…......0essensa cnc cn sencn000 60
UNZÂP .....2ccessacacscac cn ce cccc 0000000 120 ZCAt ..........csconsarasensnensensac00ee 59
updatedb ..............…........10senssces 38 ZÎP ...….…...sossessssen ccs e ca cec ec 0n 0000 63
UPptime ...…..….......00scenensse ce sn ecan00e 85 Zipinfo .….….….….…..…....cosesessssocsasa00e 120
SUSER ..........e es sc en se e se se nn 000e 99,148 ZlESS .......ccsccsecueec cec renn ce scc cn000 59
UtÉS Lec.Lccce ns se cn n e nn n en cn nn e 54,102 ZSD .....ecccucsercars se cs ecrn c00000 100, 160
"/ZSRYC L.cscne se nc nc se nc sa en 00 104, 160
variable ... 139-145
IVAT/LOE s..ccsc ccs cu ns cnc ce nn en a en neu se 49

contenant des espaces .........….….. 142


définir ........00200000000 0s a 000000 139
dans tcsh ....…..…...….….….…..…ssoesse 160
EXPportée ......….…....….….….….…scesnenans 139
MOM .......200000 00000000 a nc cn000 139
paramètre positionnel ..…....…..….….... 141
variable d’environnement ..........….….…... 99
dans tcsh ....…......…....….…ousss 160
dans les scripts ..……….....….…....... 144
et variables ordinaires .........….….….. 139

à 6 RR 109
lire L.......c.ne sc 0c se se es a sn ce 00000 99
modifier ....................….…… 100

A 35 e L 162
ViM ...... 200ec 0c 0s ec se ce se en 0 00000 30, 74, 99

W3M ...s sa0sa s000e 0s a s0 n 000000 sauues 82

7 E 54, 116, 131


WAËCH ......2.0se se c n0en crcs 0n n000000 85, 117

p 2452 R 81
WAIfÉ ..........ce cu onso ce 00 00en mmc n ca00s 56
Web L.........e ccn nc e e se en e 0000000 81, 82

--post-data ..….….……....….....…..e0s 82
—k, -O, -pH ............0cocsecsaness 81
WHiCh ....eccsonscccececnn 00n c0000000000 160
While ............ecssccnsesns0osa0ava0e 150
wildcard .….….…...............…scessensnsess 35
Windows ..….…........…encec ccs us 0 en a 00000 15
Dans la même collection

Offrez une présentation Irrégrocheble à vos documents Becouviee des pritiésanes simyles où éhimite, wt sattes ba mms à bn pâ

lastafiation {Vhndaws, Mac, Linax) * Fractiles


Le tecte e les maths » Cryptograntie
250 EXEMPLES
Les tabdeaux
tsages el les dessins
avancés r j » EXEMPLES
ï s60 Problèmes diporots clossiques;
à eppervonter & coveur-aoités » Programmaton pour sébulents
moene ce mms ; Explicaton des mossages d'esreur
28 EXERCICES
1ndex trés complat $ sr“1sexeemices
! P fétion p Aesrenisongo de Ruñr
pes à pas
40 RÉSUMÉS
en Bn e shapare

Nä Ber hamægggè5*W ! ; e
Qu’avez-vous pensé de ce livre ?

— A-t-il répondu à vos attentes ?


— Était-il instructif ? pratique ? stimulant ?
— Vous a-t-il permis de passer à l’action ?

Dites-nous ce que vous avez aimé et ce qui vous a manqué, ce que nous
faisons bien et ce que nous pourrions améliorer. Votre avis est précieux !

Tous les courriers sont étudiés par l’auteur et par l’équipe éditoriale.

contact@H-K.fr

wvww.H-K.fr
LA COLLECTION MINIMAX

» Aller à l’essentiel

Objectifs
» Comprendre comment ça marche
» Réaliser votre projet

Vous vous lancez dans l’apprentissage d’un nouvel outil. Parmi les cen­
taines de possibilités qu’il recèle, vous devez découvrir et maîtriser rapidement
celles qui vous seront utiles.
Vous avez besoin que des spécialistes du sujet sélectionnent pour vous tout
ce qui sert vraiment en pratique et vous montrent, exemples à l’appui, com­
ment ça marche.

Suivez le guide
Ce livre est conçu comme un guide de voyage, qui présente un aperçu
du pays, des informations ciblées et des phrases de conversation. C’est un
guide pratique qui privilégie les besoins les plus fréquents.

R
Il ne vous conviendra pas si vous pensez que la bonne méthode pour
découvrir la Chine, c’est de lire un dictionnaire de chinois.
Note du marketing : il convierct à tout le monde !

Mais vous connaissez l’adage : « Choisir, c’est renoncer. »


— Beaucoup d’ouvrages informatiques ne renoncent à rien et deviennent
des pavés indigestes.
— D’autres renoncent à tout et se réduisent à des aide-mémoire qui n’ex­
pliquent rien.
Dans les MiniMax; vous trouverez enfin les compromis équilibrés et bien
construits dont nous avons tous'besoin pour démarrer sur un nouveau sujet.

Résumé
» D’abord le plus utile, ensuite » La pratique, pas la théorie.

MINIMAX
Des livres qu’on lit vraiment

Vous aimerez peut-être aussi