systeme19.md 38.5 KB
Newer Older
GiYoM's avatar
GiYoM committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14

---
author:
- Guillaume Connan
date: 'October 13, 2019'
title: Système 1
---

# Système 1

## Unix, Linux, GNU et les logiciels libres

### Unix

GiYoM's avatar
GiYoM committed
15
Dennis RITCHIE regarde Ken THOMPSON taper
GiYoM's avatar
GiYoM committed
16 17
sur un terminal Teletype 33 relié au PDP-11/20 juste en face. Nous
sommes en 1972 et ils viennent de mettre au point le *système
GiYoM's avatar
GiYoM committed
18
d'exploitation* UNIX:
GiYoM's avatar
GiYoM committed
19

GiYoM's avatar
GiYoM committed
20
![image](./IMG/ritchiethompson.jpg)
GiYoM's avatar
GiYoM committed
21 22 23

Le but est de pouvoir disposer d'un sytème d'exploitation utilisable sur
toute machine. Il était initialement écrit en assembleur puis en langage
GiYoM's avatar
GiYoM committed
24
C en 1973 après l'invention de ce langage par RITCHIE.
GiYoM's avatar
GiYoM committed
25 26

S'ensuit une guerre de licences, surtout après qu'un étudiant
GiYoM's avatar
GiYoM committed
27
californien, Billy JOY modifie UNIX et le
GiYoM's avatar
GiYoM committed
28
distribue pour juste \$40 sous l'appellation *Berkeley Software
GiYoM's avatar
GiYoM committed
29
Distribution* (BSD)[^1].
GiYoM's avatar
GiYoM committed
30 31

Dans les années 1990, les noyaux Linux et FreeBSD, basés sur
GiYoM's avatar
GiYoM committed
32
UNIX, apparaissent et sont diffusés librement dans le
GiYoM's avatar
GiYoM committed
33 34
monde entier sous l'impulsion de programmeurs enthousiastes. En 2000,
Apple sort le système d'exploitation Darwin (qui sera ensuite rebaptisé
GiYoM's avatar
GiYoM committed
35
MacOS) basé lui aussi sur UNIX.
GiYoM's avatar
GiYoM committed
36

GiYoM's avatar
GiYoM committed
37 38
La philosophie d'UNIX a été résumée en 2003 par Eric S.
RAYMOND en dix grandes règles:
GiYoM's avatar
GiYoM committed
39

GiYoM's avatar
GiYoM committed
40
1. **Règle de Modularité** : Écrire des éléments simples reliés par de bonnes interfaces.
GiYoM's avatar
GiYoM committed
41

GiYoM's avatar
GiYoM committed
42
2. **Règle de Clarté**   : La Clarté vaut mieux que l'ingéniosité.
GiYoM's avatar
GiYoM committed
43

GiYoM's avatar
GiYoM committed
44
3. **Règle de Composition**: Concevoir des programmes qui peuvent être reliés à d'autres
GiYoM's avatar
GiYoM committed
45 46
    programmes.

GiYoM's avatar
GiYoM committed
47 48
4. **Règle de  Séparation**: Séparer les règles du fonctionnement  ; Séparer les
   interfaces du mécanisme. 
GiYoM's avatar
GiYoM committed
49

GiYoM's avatar
GiYoM committed
50 51
5.  **Règle de  Simplicité**:  Concevoir  pour la  simplicité  ;  ajouter de  la
   complexité seulement 
GiYoM's avatar
GiYoM committed
52 53
    par obligation.

GiYoM's avatar
GiYoM committed
54
6. **Règle de Parcimonie** : Écrire un gros programme seulement lorsqu'il est clairement
GiYoM's avatar
GiYoM committed
55 56
    démontrable que c'est l'unique solution.

GiYoM's avatar
GiYoM committed
57 58
7. **Règle de Transparence** : Concevoir pour la visibilité de façon à faciliter la revue et le
    déverminage. 
GiYoM's avatar
GiYoM committed
59

GiYoM's avatar
GiYoM committed
60 61
8. **Règle de Robustesse**: La robustesse  est l'enfant de la transparence et de
   la simplicité. 
GiYoM's avatar
GiYoM committed
62

GiYoM's avatar
GiYoM committed
63
9. **Règle de Représentation** : : Inclure le savoir dans les données, de manière que l'algorithme
GiYoM's avatar
GiYoM committed
64 65
    puisse être bête et robuste.

GiYoM's avatar
GiYoM committed
66
10. **Règle de La moindre surprise** : Pour la conception d'interface, réaliser la chose la moins
GiYoM's avatar
GiYoM committed
67 68
    surprenante.

GiYoM's avatar
GiYoM committed
69
11. **Règle du Silence**
GiYoM's avatar
GiYoM committed
70 71
:   Quand un programme n'a rien d'étonnant à dire, il doit se taire.

GiYoM's avatar
GiYoM committed
72
12. **Règle de Dépannage**
GiYoM's avatar
GiYoM committed
73 74 75
:   Si le programme échoue, il faut le faire bruyamment et le plus tôt
    possible.

GiYoM's avatar
GiYoM committed
76
13. **Règle d'Économie**
GiYoM's avatar
GiYoM committed
77 78 79
:   Le temps de programmation est cher, le préserver par rapport au
    temps de la machine.

GiYoM's avatar
GiYoM committed
80
14. **Règle de Génération**
GiYoM's avatar
GiYoM committed
81 82 83
:   Éviter la programmation manuelle ; Écrire des programmes qui
    écrivent des programmes autant que possible.

GiYoM's avatar
GiYoM committed
84
15. **Règle d'Optimisation**
GiYoM's avatar
GiYoM committed
85 86
:   Prototyper avant de fignoler. Mettre au point avant d'optimiser.

GiYoM's avatar
GiYoM committed
87
16. **Règle de Diversité**
GiYoM's avatar
GiYoM committed
88 89
:   Se méfier des affirmations de « Unique bonne solution ».

GiYoM's avatar
GiYoM committed
90
17. **Règle d'Extensibilité**
GiYoM's avatar
GiYoM committed
91 92
:   Concevoir pour le futur, car il arrivera plus vite que prévu.

GiYoM's avatar
GiYoM committed
93
Ce qu'il résume aussi en **Keep it Simple, Stupid!**, connu comme le
GiYoM's avatar
GiYoM committed
94 95 96
*KISS principle*.

Ces règles n'ont malheureusement pas toujours été suivies dans les
GiYoM's avatar
GiYoM committed
97
versions dérivées d'UNIX\...
GiYoM's avatar
GiYoM committed
98

GiYoM's avatar
GiYoM committed
99
Environ 85% des smartphones sont des systèmes UNIX, les
GiYoM's avatar
GiYoM committed
100
500 plus grands supercalculateurs sont des systèmes Linux donc dérivés
GiYoM's avatar
GiYoM committed
101
d'UNIX.
GiYoM's avatar
GiYoM committed
102

GiYoM's avatar
GiYoM committed
103
Les grands principes de fonctionnement des systèmes UNIX
GiYoM's avatar
GiYoM committed
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
sont:

-   de disposer d'interpréteurs de commande appelés des *shells*;

-   de disposer de nombreux petits programmes agissant sur des flux de
    texte et reliés par des tubes (*pipes*;

-   tout est fichier ou processus. Tout est organisé autour d'un système
    de fichiers hiérarchique ayant une unique racine.

[^1]: Pendant cette guerre qui aura lieu pendant les années 1980,
    Windows basé sur MS-DOS aura les coudées franches pour s'imposer\...



### GNU


GiYoM's avatar
GiYoM committed
122
![image](./IMG/richardstallman.jpeg)
GiYoM's avatar
GiYoM committed
123 124

Alors chercheur au laboratoire d'IA du MIT en 1980, Richard
GiYoM's avatar
GiYoM committed
125
STALLMANN rapporte l'anecdote suivante:
GiYoM's avatar
GiYoM committed
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

>  *Une fois, j'ai vu ce que c'est d'utiliser un programme dont on ne
> connaît pas le code source. Ça s'est passé quand Xerox a donné au MIT
> une imprimante laser. C'était \[...\] la première génération des
> imprimantes laser. \[...\] C'était vraiment bien, mais pas tout à fait
> fiable. Parfois, plusieurs fois par heure, elle se bloquait. \[...\]
> Notre ancienne imprimante avait le même problème, mais l'ancienne
> était contrôlée par du logiciel libre, donc nous possédions le code
> source pour ce programme, et nous avions pu ajouter des
> fonctionnalités spéciales pour nous débrouiller avec ces problèmes.
> Avec la nouvelle imprimante, nous n'avons pas pu le faire car Xerox ne
> nous avait pas donné le code source du programme. Nous ne pouvions pas
> faire de changements dans le programme. Nous étions capables d'écrire
> ces fonctions mais nous étions bloqués volontairement par Xerox, nous
> étions prisonniers d'un logiciel qui a mal fonctionné pendant
> plusieurs années. \[...\] C'était dégueulasse*

![image](./IMG/cartelibre.png){width="\linewidth"}


C'est suite à cette histoire qu'il décide de lancer le projet
GiYoM's avatar
GiYoM committed
147
GNU (GNU Is not UNIX) qui doit
GiYoM's avatar
GiYoM committed
148
fournir une version d'UNIX entièrement libre. Mais
GiYoM's avatar
GiYoM committed
149 150 151
qu'est-ce qu'un logiciel libre?

Voici la définition de la *Free Software Foundation*
GiYoM's avatar
GiYoM committed
152
(FSF):
GiYoM's avatar
GiYoM committed
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179

>  *« Logiciel libre » \[free software\] désigne des logiciels qui
> respectent la liberté des utilisateurs. En gros, cela veut dire que
> les utilisateurs ont la liberté d'exécuter, copier, distribuer,
> étudier, modifier et améliorer ces logiciels. Ainsi, « logiciel libre
> » fait référence à la liberté, pas au prix (free as free speech as
> opposed to free beer).*

Un programme est ainsi un logiciel libre si vous, en tant qu'utilisateur
de ce programme, avez les quatre libertés essentielles :

-   la liberté d'exécuter le programme comme vous voulez, pour n'importe
    quel usage (liberté 0);

-   la liberté d'étudier le fonctionnement du programme, et de le
    modifier pour qu'il effectue vos tâches informatiques comme vous le
    souhaitez (liberté 1) ; l'accès au code source est une condition
    nécessaire;

-   la liberté de redistribuer des copies, donc d'aider votre voisin
    (liberté 2);

-   la liberté de distribuer aux autres des copies de vos versions
    modifiées (liberté 3); en faisant cela, vous donnez à toute la
    communauté une possibilité de profiter de vos changements; l'accès
    au code source est une condition nécessaire.

GiYoM's avatar
GiYoM committed
180
La plupart des distributions UNIX étant propriétaires,
GiYoM's avatar
GiYoM committed
181 182
STALLMANN décide de créer un système d'exploitation
entièrement libre et lance GNU en 1983. Toutes les
GiYoM's avatar
GiYoM committed
183
commandes UNIX ont été ré-implantées.
GiYoM's avatar
GiYoM committed
184

GiYoM's avatar
GiYoM committed
185 186
En 1991,GNU est presque prêt. Il lui manque un noyau.
L'équipe travaille sur un noyau dénommé HURD mais\....
GiYoM's avatar
GiYoM committed
187 188 189

## Linux

GiYoM's avatar
GiYoM committed
190
![image](./IMG/linus.jpeg)
GiYoM's avatar
GiYoM committed
191

GiYoM's avatar
GiYoM committed
192 193
...au même moment,  un jeune étudiant finlandais, Linus TORVALDS,  crée le noyau
LINUX et le publie 
GiYoM's avatar
GiYoM committed
194 195 196 197
sous licence libre. C'est la naissance du système d'exploitation
GNU/Linux qui va connaître un succès mondial.

Linux est un énorme programme d'une dizaine de Mo écrit principalement
GiYoM's avatar
GiYoM committed
198
en C et ne contenant aucun code original UNIX, mais, sauf
GiYoM's avatar
GiYoM committed
199
sur des systèmes embarqués, il ne saurait se suffire à lui-même. Il doit
GiYoM's avatar
GiYoM committed
200
donc être associé àGNU pour former un véritable système
GiYoM's avatar
GiYoM committed
201 202 203 204 205 206
d'exploitation (OS) ou encore Android par exemple. On doit donc parler
de GNU/Linux ou de Android/Linux.

### Différents types de logiciels


GiYoM's avatar
GiYoM committed
207
* **Propriétaires**
GiYoM's avatar
GiYoM committed
208 209 210
:   : ils sont distribués sous une licence restrictive qui interdit de
    les copier, modifier, d'avoir accès aux sources.

GiYoM's avatar
GiYoM committed
211
* **Sharewares**
GiYoM's avatar
GiYoM committed
212 213 214
:   : ils sont distribués gratuitement pendant une période d'essai puis
    les utilisateurs doivent payer pour les utiliser.

GiYoM's avatar
GiYoM committed
215
* **Freewares**
GiYoM's avatar
GiYoM committed
216 217 218 219 220
:   Ici le *free* signifie gratuit: ce sont donc des logiciels
    disponibles gratuitement mais ils sont le plus souvent sous la
    formes de binaires donc on ne peut pas les modifier ni savoir
    comment ils ont é conçus.

GiYoM's avatar
GiYoM committed
221
* **Free softwares**
GiYoM's avatar
GiYoM committed
222 223 224 225 226 227
:   : ce sont les logiciels libres. On vient d'en parler.

### Qu'est-ce qu'un système d'exploitation?


Il y a plusieurs SE (ou OS) comme ceux déjà évoqués mais aussi MS-DOS,
GiYoM's avatar
GiYoM committed
228
MS-Windows, Windows-NT,...
GiYoM's avatar
GiYoM committed
229

GiYoM's avatar
GiYoM committed
230
Nous ne nous intéresserons qu'aux systèmes UNIX et plus
GiYoM's avatar
GiYoM committed
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
particulièrement GNU/Linux.

#### Système informatique


Un système informatique est constitué:

1.  du matériel (*hardware*): CPU, mémoire, E/S;

2.  du système d'exploitation qui est un programme jouant le rôle
    d'intermédiaire entre les utilisateurs et le matériel;

3.  des programmes d'application à disposition des utilisateurs afin de
    résoudre leurs problèmes;

4.  des utilisateurs qui peuvent être des êtres humains mais aussi des
    machines.

#### But d'un SE


Le SE doit:

1.  fournir un environnement pratique afin que l'utilisateur (humain ou
    machine) puisse exécuter des programmes;

2.  utiliser efficacement les ressources matérielles.

#### Rôles d'un SE


1.  C'est une *machine virtuelle* en ce sens qu'elle permet à
    l'utilisateur d'avoir accès aux ressources en faisant *abstraction*
    des détails de fonctionnement. Les objets abstraits impliqués sont
    les *fichiers* et les *processus*.

    Ainsi un disque physique apparaît comme un répertoire de fichiers.

2.  C'est aussi un *administrateur de ressources* qui gère leur
    utilisation sans impliquer l'utilisateur (processus, mémoire,
    fichiers, E/S).

### Modes de fonctionnement


GiYoM's avatar
GiYoM committed
276
![image](./IMG/privileges.jpg)
GiYoM's avatar
GiYoM committed
277 278 279 280 281

Pour éviter qu'un mauvais programme ne sème la pagaïe dans le système,
il est protégé par le *mode double*. Certaines instructions critiques
sont dites *privilégiées*. Les deux modes sont:

GiYoM's avatar
GiYoM committed
282
* **Mode utilisateur** : dans ce mode, il n'est pas possible d'exécuter une instruction
GiYoM's avatar
GiYoM committed
283 284
    privilégiée. Toute tentative de le faire est traitée comme illégale.

GiYoM's avatar
GiYoM committed
285
* **Mode SUperviseur**   : les instructions privilégiées ne peuvent être exécutées que dans
GiYoM's avatar
GiYoM committed
286 287 288 289 290
    ce mode.

Nous détaillerons ces modes sur GNU/Linux plus loin.

```shell
GiYoM's avatar
GiYoM committed
291 292
moi@moi: $aptitude update
E: Impossible d ouvrir le fichier verrou /var/lib/apt/lists/lock - open (13: Permission non accordée)
GiYoM's avatar
GiYoM committed
293 294
E: Impossible de verrouiller le répertoire /var/lib/apt/lists/

GiYoM's avatar
GiYoM committed
295 296
moi@moi:~$ sudo aptitude update 
Mot de passe de moi :
GiYoM's avatar
GiYoM committed
297 298 299 300 301 302
http://ftp.debian.org/debian sid InRelease Atteint
http://deb.debian.org/debian buster InRelease 39.1 ko téléchargés en 2s
(15.8 ko/s)
```


GiYoM's avatar
GiYoM committed
303 304


GiYoM's avatar
GiYoM committed
305 306 307 308 309 310 311 312 313
## Shell


C'est l'interface pour parler au système. C'est la coque (*shell*) au
sens d'un fruit sec qui contient le noyau (*kernel*) : c'était la couche
la plus haute du système par opposition aux couches de bas-niveau au
niveau matériel.

Il existe de nombreux shells: `sh` (le shell historique créé par le
GiYoM's avatar
GiYoM committed
314
Britannique Stephen BOURNE en 1977), `ksh`, `csh`, `tcsh`,
GiYoM's avatar
GiYoM committed
315
`zsh` mais celui que nous utiliserons est `bash` (comme Bourne Again
GiYoM's avatar
GiYoM committed
316
SHell, encore un jeu de mot...Bourne/born et de plus *to bash* signifie
GiYoM's avatar
GiYoM committed
317 318 319 320 321 322 323 324 325 326 327 328 329 330
frapper, cogner.

En classe, nous travaillerons sur nos Raspberries PI.



### Commandes

Une commande est lancée en tapant quelque chose sous la forme:

    nom_commande -les_options arg1 arg2 arg3 ...

Par exemple:

GiYoM's avatar
GiYoM committed
331
```shell
GiYoM's avatar
GiYoM committed
332 333
    $ ls -l ./LYCEE/INFO/1ere/2019_20/Systeme/systeme19.tex 
    -rw-r--r-- 1 moi moi 15439 Sep 29 17:10 ./LYCEE/INFO/1ere/2019_20/Systeme/systeme19.tex
GiYoM's avatar
GiYoM committed
334
```
GiYoM's avatar
GiYoM committed
335 336 337 338 339 340 341 342 343 344 345 346 347 348 349

Le signifie qu'on est en mode utilisateur. Le indiquera qu'on sera en
mode superviseur.

Les arguments de la fonction sont séparés par des espaces.

Il existe des commandes internes, encore appelées *primitives*
(*builtin*, qui est directement interprétée par le Shell.

Il y a également des commandes externes qui renvoie à un fichier
exécutable dont on indique le chemin d'accès sauf s'il est dans le
chemin d'accès aux exécutables, le `PATH` (qui est une variable
d'environnement. Nous en reparlerons plus tard). La commande `type` nous
permet de distinguer ces types de commmandes:

GiYoM's avatar
GiYoM committed
350
```shell
GiYoM's avatar
GiYoM committed
351 352 353 354 355
    $ type echo
    echo est une primitive du shell

    $ type python
    python est /home/moi/anaconda3/bin/python
GiYoM's avatar
GiYoM committed
356
```
GiYoM's avatar
GiYoM committed
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395

On peut obtenir de l'aide sur une commande en mettant comme option:

    $ type --help
    "type: type [-afptP] nom [nom ...]
        Affiche des informations sur le type de commande.
        
        Pour chaque NOM, indique comment il serait interprété s'il était
        utilisé comme un nom de commande.
        
        Options :
          -a    affiche tous les emplacements contenant un exécutable nommé NOM;
                y compris les alias, les commandes intégrées et les fonctions si et seulement si
                l'option « -p » n'est pas utilisée
          -f    désactive la recherche de fonctions du shell
          -P    force une recherche de CHEMIN pour chaque NOM, même si c'est un alias,
                une commande intégrée ou une fonction et renvoie le nom du fichier du disque
                qui serait exécuté
          -p    renvoie le nom du fichier du disque qui serait exécuté sauf si
                « type -t NOM » aurait renvoyé autre chose que « file » auquel cas, rien
                n'est renvoyé.
          -t    affiche un mot unique parmi « alias », « keyword »,
                « function », « builtin », « file » or « », si NOM est respectivement un alias,
                un mot réservé du shell, une fonction du shell, une commande intégrée,
                un fichier du disque ou un nom inconnu
        
        Arguments :
          NOM   Nom de commande à interpréter.
        
        Code de retour :
        Renvoie le code de succès si tous les NOMs sont trouvés, le code d'échec si l'un
        d'entre eux n'est pas trouvé."

### Erreurs: premier survol

Vous serez sûrement amenés à lire quelqes messages d'erreur:

1.  Bash ne trouve pas votre commande, soit parce qu'elle n'existe pas,
    soit parce qu'elle n'est pas dans le `PATH`, soit que son nom est
GiYoM's avatar
GiYoM committed
396
    mal tapé,...
GiYoM's avatar
GiYoM committed
397

GiYoM's avatar
GiYoM committed
398
```shell
GiYoM's avatar
GiYoM committed
399 400
        $ fantome
        bash: fantome : commande introuvable
GiYoM's avatar
GiYoM committed
401
```
GiYoM's avatar
GiYoM committed
402 403 404 405

2.  un des arguments est erroné. Par exemple ici on demande de copier un
    fichier qui n'existe pas ou dont le chemin d'accès est mauvais:

GiYoM's avatar
GiYoM committed
406
```shell
GiYoM's avatar
GiYoM committed
407 408
        $ cp fantome /home/moi
        cp: impossible d\'évaluer 'fantome': Aucun fichier ou dossier de ce type
GiYoM's avatar
GiYoM committed
409
```
GiYoM's avatar
GiYoM committed
410 411 412 413

3.  un utilisateur essaie d'effectuer une action seulement permise au
    superviseur:

GiYoM's avatar
GiYoM committed
414
```shell
GiYoM's avatar
GiYoM committed
415 416 417 418 419 420
        $ touch fichier.txt # permet ici de créer le fichier fichier.txt

        $ cp fichier.txt /usr/bin/
        cp: impossible de créer le fichier standard '/usr/bin/fichier.txt': Permission non accordée

        $ rm fichier.txt # permet de détruire le fichier fichier.txt
GiYoM's avatar
GiYoM committed
421
```
GiYoM's avatar
GiYoM committed
422 423 424

4.  on lance une commande avec une mauvaise option:

GiYoM's avatar
GiYoM committed
425
```shell
GiYoM's avatar
GiYoM committed
426 427 428 429
        $ touch fichier.txt
        [moi@moi ~]$ cp fichier.txt /usr/bin/
        cp: impossible de créer le fichier standard '/usr/bin/fichier.txt': Permission non accordée
        $ rm fichier.txt
GiYoM's avatar
GiYoM committed
430
```
GiYoM's avatar
GiYoM committed
431 432 433 434 435 436

La gestion des erreurs est un problème important sur lequel nous
reviendrons.

### Le clavier est votre ami

GiYoM's avatar
GiYoM committed
437
![image](./IMG/gnulevite.png)
GiYoM's avatar
GiYoM committed
438 439 440 441 442 443 444 445

Il ne faut pas confondre affluence d'icônes à cliquer et ergonomie. Le
shell est un des outils les plus ergonomiques en ce sens qu'il permet
d'exprimer de manière concise et précise tout ce que l'on veut faire
faire à la machine.

Par exemple, les flèches , permettent de rappeler la commande précédente
ou la commande suivante. Pour la petite histoire, c'est Bill
GiYoM's avatar
GiYoM committed
446
GATES qui a codé ces touches UNIX quand il
GiYoM's avatar
GiYoM committed
447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
était étudiant :)

L'autre touche extrèmement utile est la tabulation qui permet de
**compléter** les noms de commandes, de fichiers en ne tapant que les
premiers caractères. Cela évite les fautes de frappe et permet aussi de
vérifier si ce que l'on tape ou cherche existe bien.

### Caractères génériques

Nous ne parlerons pas déjà d'expressions régulières mais deux caractères
génériques (*wildcards*) seront utiles: l'astérisque et le point
d'interrogation.

L'astérisque permet de remplacer n'importe quel nombre de caractères.

Par exemple, si nous cherchons tous les fichiers dont le nom commence
par *PolyInfo* du répertoire courant:

GiYoM's avatar
GiYoM committed
465
```shell
GiYoM's avatar
GiYoM committed
466 467
    $ ls PolyInfo*
    PolyInfo1ere_19_20.aux  PolyInfo1ere_19_20.log  PolyInfo1ere_19_20.out  PolyInfo1ere_19_20.pdf  PolyInfo1ere_19_20_Tab.mp  PolyInfo1ere_19_20.tex
GiYoM's avatar
GiYoM committed
468
```
GiYoM's avatar
GiYoM committed
469 470 471 472 473

Maintenant si je cherche les fichiers dont l'extension s'écrit avec
trois lettres, la dernière étant *x*, je peux utiliser qui représente un
caractère quelconque:

GiYoM's avatar
GiYoM committed
474
```shell
GiYoM's avatar
GiYoM committed
475 476
    $ ls *.??x
    config.cxx  PolyInfo1ere_19_20.aux  PolyInfo1ere_19_20.tex
GiYoM's avatar
GiYoM committed
477
```
GiYoM's avatar
GiYoM committed
478 479 480 481

Le système de fichiers
----------------------

GiYoM's avatar
GiYoM committed
482
Dans un système UNIX, tout est fichier, que ce soit de
GiYoM's avatar
GiYoM committed
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498
manière classique un fichier contenant des données, mais aussi un
répertoire, un lien vers un autre fichier, un canal de communication
vers un processus,\...

Dans un premier temps, nous ne nous occuperons que des fichiers au sens
classique (*regular files*).

Le système peut être vu comme un **arbre** dont les **nœuds** sont les
**répertoires** et les **feuilles** sont les **fichiers**.

La commande `tree` avec l'option `-L` fixée à 1 nous renvoie
l'arborescence de niveau 1 d'un répertoire.

Regardons l'arborescence de niveau 1 à la racine qui est symbolisée par
:

GiYoM's avatar
GiYoM committed
499
```shell
GiYoM's avatar
GiYoM committed
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530
    $ tree -L 1 /
    /
    |--- bin
    |--- boot
    |--- dev
    |--- etc
    |--- home
    |--- initrd.img -> boot/initrd.img-5.2.0-2-amd64
    |--- initrd.img.old -> boot/initrd.img-4.9.0-9-amd64
    |--- lib
    |--- lib32
    |--- lib64
    |--- lost+found
    |--- media
    |--- mnt
    |--- opt
    |--- proc
    |--- R
    |--- root
    |--- run
    |--- sbin
    |--- snap
    |--- srv
    |--- sys
    |--- tmp
    |--- usr
    |--- var
    |--- vmlinuz -> boot/vmlinuz-5.2.0-2-amd64
    |--- vmlinuz.old -> boot/vmlinuz-4.9.0-9-amd64

    23 directories, 4 files
GiYoM's avatar
GiYoM committed
531 532
```

GiYoM's avatar
GiYoM committed
533 534 535 536

Voyons maintenant l'arborescence complète du répertoire personnel d'un
utilisateur (`joe`):

GiYoM's avatar
GiYoM committed
537
![image](./tree1.png)
GiYoM's avatar
GiYoM committed
538 539 540 541

Si l'on veut la liste des fichiers présents dans le répertoire
`France_Culture`, on utilise **`ls`** (comme LiSte):

GiYoM's avatar
GiYoM committed
542
```shell
GiYoM's avatar
GiYoM committed
543 544
    joe@moi:~$ ls ./Documents/Podcasts/France_Culture/
    Cesar.ogg  Fanny.ogg  Marius.ogg
GiYoM's avatar
GiYoM committed
545
```
GiYoM's avatar
GiYoM committed
546 547 548 549

Si l'on veut plus de renseignements, on rajoute l'option **`-l`** (comme
Long):

GiYoM's avatar
GiYoM committed
550
```shell
GiYoM's avatar
GiYoM committed
551
    joe@moi:~$ ls -l ./Documents/Podcasts/France_Culture/
GiYoM's avatar
GiYoM committed
552 553 554 555
    total 0
    -rw-r--r-- 1 joe joe 0 Sep 30 23:10 Cesar.ogg
    -rw-r--r-- 1 joe joe 0 Sep 30 23:10 Fanny.ogg
    -rw-r--r-- 1 joe joe 0 Sep 30 23:10 Marius.ogg
GiYoM's avatar
GiYoM committed
556
```
GiYoM's avatar
GiYoM committed
557 558 559

Expliquez ce qui se passe ici:

GiYoM's avatar
GiYoM committed
560
```shell
GiYoM's avatar
GiYoM committed
561
    joe@moi:~$ rm ./Documents/Podcasts/France_Culture/Marius.ogg 
GiYoM's avatar
GiYoM committed
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580

    joe@moi:~$ ls ./Documents/Podcasts/France_Culture/
    Cesar.ogg  Fanny.ogg

    joe@moi:~$ cp  ./Documents/Podcasts/France_Culture/Cesar.ogg ./Documents/Podcasts/BBC/

    joe@moi:~$ ls ./Documents/Podcasts/France_Culture/
    Cesar.ogg  Fanny.ogg

    joe@moi:~$ ls ./Documents/Podcasts/BBC/
    Cesar.ogg Wasps.ogg

    joe@moi:~$ mv ./Documents/Podcasts/BBC/Cesar.ogg ./Documents/Podcasts/France_Culture/SesZars.ogg

    joe@moi:~$ ls ./Documents/Podcasts/BBC/
    Wasps.ogg

    joe@moi:~$ ls ./Documents/Podcasts/France_Culture/
    Cesar.ogg  Fanny.ogg  SesZars.ogg
GiYoM's avatar
GiYoM committed
581 582 583
```

...et là, en regardant la documentation des commandes:
GiYoM's avatar
GiYoM committed
584 585


GiYoM's avatar
GiYoM committed
586
```shell
GiYoM's avatar
GiYoM committed
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
    joe@moi:~$ pwd
    /home/joe

    joe@moi:~$ whoami
    joe

    joe@moi:~$ cd ./Documents/Podcasts/

    joe@moi:~/Documents/Podcasts$ cd ./BBC/

    joe@moi:~/Documents/Podcasts/BBC$ cd ..

    joe@moi:~/Documents/Podcasts$ cd ../../Info/1ere/

    joe@moi:~/Info/1ere$ ls
    Cours  Defis  Projets
GiYoM's avatar
GiYoM committed
603
```
GiYoM's avatar
GiYoM committed
604 605 606

Nous avons vu en cours , , :

GiYoM's avatar
GiYoM committed
607
```shell
GiYoM's avatar
GiYoM committed
608 609 610 611
    joe@moi:~$ cd ./Info/1ere/Defis/
    joe@moi:~/Info/1ere/Defis$ cp ./defi4.py ../../../TP_systeme/commandes/
    joe@moi:~/Info/1ere/Defis$ ls ~/TP_systeme/commandes/
    defi4.py  essai2.txt
GiYoM's avatar
GiYoM committed
612
```
GiYoM's avatar
GiYoM committed
613 614 615 616

Ces commandes ne concernent que les fichiers. Pour les répertoires, il
faut faire autrement:

GiYoM's avatar
GiYoM committed
617
```shell
GiYoM's avatar
GiYoM committed
618 619 620 621 622
    joe@moi:~/Info/1ere$ rmdir Projets/
    joe@moi:~/Info/1ere$ ls
    Cours  Defis
    joe@moi:~/Info/1ere$ rmdir Defis/
    rmdir: impossible de supprimer 'Defis/': Le dossier n'est pas vide
GiYoM's avatar
GiYoM committed
623
```
GiYoM's avatar
GiYoM committed
624 625 626 627

On ne peut supprimer qu'un dossier vide. Il faut donc vider le dossier
avant de le supprimer:

GiYoM's avatar
GiYoM committed
628

GiYoM's avatar
GiYoM committed
629
```shell
GiYoM's avatar
GiYoM committed
630 631 632 633 634 635 636 637
    joe@moi:~/Info/1ere$ mkdir ./Projets
    joe@moi:~/Info/1ere$ touch ./Projets/fic1.alive
    joe@moi:~/Info/1ere$ touch ./Projets/fic2.alive
    joe@moi:~/Info/1ere$ rmdir Projets/
    rmdir: impossible de supprimer 'Projets/': Le dossier n'est pas vide
    joe@moi:~/Info/1ere$ rm -r Projets/
    joe@moi:~/Info/1ere$ ls
    Cours  Defis
GiYoM's avatar
GiYoM committed
638 639
```

GiYoM's avatar
GiYoM committed
640 641 642 643 644 645 646 647 648

L'option `-r` signifie *récursivement*: la commande de destruction va
être appliquer à toute l'arborescence contenue sur la branche `Projets`
et finalement sur la branche `Projets` elle-même.

Une autre commande importante à connaître : **find** qui, comme son nom
l'indique, permet de trouver des fichiers qui obéissent à un certain
critère.

GiYoM's avatar
GiYoM committed
649

GiYoM's avatar
GiYoM committed
650
```shell
GiYoM's avatar
GiYoM committed
651 652 653 654
    joe@moi:~/Truc$ find ./Python/ -name '*.ogg'
    ./Python/Documents/Podcasts/France_Culture/Marius.ogg
    ./Python/Documents/Podcasts/France_Culture/Fanny.ogg
    ./Python/Documents/Podcasts/France_Culture/Cesar.ogg
GiYoM's avatar
GiYoM committed
655 656 657
```


GiYoM's avatar
GiYoM committed
658 659 660 661 662 663

On cherche les fichiers à partir du répertoire `Python` dont le nom à
pour extension `ogg`.

Commandes à connaître:

GiYoM's avatar
GiYoM committed
664
`whoami,  cd,  pwd, ls,  cp,    mv, rm, rmdir, tree`
GiYoM's avatar
GiYoM committed
665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681
Nous avons également vu en classe le principe de l'arborescence, les
répertoires et

Redirections, flux et processus
-------------------------------

### Processus

Un **processus** est une instance d'un programme *en train de
s'exécuter*. Nous étudierons plus précisément leur gestion en Terminale.
Il faut tout de même savoir que le noyau Unix permet de gérer plusieurs
tâches et plusieurs utilisateurs grâce à l'*ordonnanceur* (*the
scheduler*) et qu'un processus peut être actif, prêt, endormi ou
suspendu.

Par exemple, en lançant la commande `top`:

GiYoM's avatar
GiYoM committed
682
![image](./IMG/top.jpg)
GiYoM's avatar
GiYoM committed
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699

Nous n'insisterons pas.

Sachez cependant que si je lance un processus puis que je ferme le
shell, alors le processus (enfant) sera tué avec le shell (son processus
parent). Les options & et &! permettent dans le premier cas de lancer
plusieurs processus par le même shell sans tuer les autres, et dans le
second cas, je peux tuer le shell parent sans tuer les enfants.

### Flux

Il faut surtout retenir en 1 qu'un processus a *trois flux* ou *trois
canaux de communication*: un d'entrée, un de sortie et un pour les
erreurs.

Par exemple, voyons la commande `read`:

GiYoM's avatar
GiYoM committed
700
```shell
GiYoM's avatar
GiYoM committed
701
    joe@moi:~/Info/1ere$ read ma_variable
GiYoM's avatar
GiYoM committed
702
```
GiYoM's avatar
GiYoM committed
703 704 705 706

Il semble ne rien se passer. En fait, le shell attend une valeur dans le
flux d'entrée qui sera stocké dans la variable `ma_variable`:

GiYoM's avatar
GiYoM committed
707
```shell
GiYoM's avatar
GiYoM committed
708 709 710 711 712
    joe@moi:~/Info/1ere$ read ma_variable
    2 + 3 = 5

    joe@moi:~/Info/1ere$ echo $ma_variable
    2 + 3 = 5
GiYoM's avatar
GiYoM committed
713
```
GiYoM's avatar
GiYoM committed
714 715 716 717 718 719 720 721 722 723 724 725

La fonction `echo` répète ce que contient la variable qui est appelée
avec un \$ devant.

### Redirection

Il faut prendre les flux comme des informations qui entrent et sortent
par ces trois tuyaux. On peut alors rediriger ces flux dans d'autres
tuyaux.

Observez et commentez:

GiYoM's avatar
GiYoM committed
726

GiYoM's avatar
GiYoM committed
727
```shell
GiYoM's avatar
GiYoM committed
728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
    joe@moi:~$ mkdir -p ~/TP_systeme/commandes/
    joe@moi:~$ cd ~/TP_systeme/commandes/

    joe@moi:~/TP_systeme/commandes$ touch essai2.txt
    joe@moi:~/TP_systeme/commandes$ echo 'Bonjour le monde' > essai2.txt 
    joe@moi:~/TP_systeme/commandes$ cat essai2.txt 
    Bonjour le monde

    joe@moi:~/TP_systeme/commandes$ echo 'Hello world' > essai2.txt 
    joe@moi:~/TP_systeme/commandes$ cat essai2.txt 
    Hello world
    joe@moi:~/TP_systeme/commandes$ echo 'Hola mundo' >> essai2.txt 
    joe@moi:~/TP_systeme/commandes$ cat essai2.txt 
    Hello world
    Hola mundo
GiYoM's avatar
GiYoM committed
743
```
GiYoM's avatar
GiYoM committed
744 745 746 747 748 749 750 751

Les caractères et permettent des redirections mais de manière
différente. Expliquez.

Expliquez ensuite le code suivant, sachant que le `2` devant les
chevrons indique que les erreurs seront redirigées vers la cible
indiquée:

GiYoM's avatar
GiYoM committed
752

GiYoM's avatar
GiYoM committed
753
```shell
GiYoM's avatar
GiYoM committed
754 755 756 757 758 759
    joe@moi:~/Info/1ere$ touch erreurs.log
    joe@moi:~/Info/1ere$ ls mystere 2>> erreurs.log
    joe@moi:~/Info/1ere$ cp mystere 2>> erreurs.log
    joe@moi:~/Info/1ere$ cp mystere ~ 2>> erreurs.log
    joe@moi:~/Info/1ere$ mystere 2>> erreurs.log
    joe@moi:~/Info/1ere$ more erreurs.log 
GiYoM's avatar
GiYoM committed
760
    ls: impossible d accéder à 'mystere': Aucun fichier ou dossier de ce type
GiYoM's avatar
GiYoM committed
761 762
    cp: opérande de fichier cible manquant après 'mystere'
    Saisissez « cp --help » pour plus d'informations.
GiYoM's avatar
GiYoM committed
763
    cp: impossible d évaluer 'mystere': Aucun fichier ou dossier de ce type
GiYoM's avatar
GiYoM committed
764
    -bash: mystere : commande introuvable
GiYoM's avatar
GiYoM committed
765
```
GiYoM's avatar
GiYoM committed
766 767 768 769 770 771

On peut également rediriger des fichiers dans le flux d'entrée avec un
chevron dans l'autre sens. Regardons par exemple comment fonctionne la
commande `bc` qui est une machine à calculer (avec l'option `-q` pour ne
pas avoir l'en-tête de lancement de la commande):

GiYoM's avatar
GiYoM committed
772
```shell
GiYoM's avatar
GiYoM committed
773 774 775 776 777 778 779 780 781 782 783 784
    joe@moi:~/Info/1ere$ bc
    bc 1.07.1
    Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type `warranty'. 
    2 + 5
    7
    quit
    joe@moi:~/Info/1ere$ bc -q
    2 + 5
    7
    quit
GiYoM's avatar
GiYoM committed
785
```
GiYoM's avatar
GiYoM committed
786 787 788

On peut donner à lire un fichier à `bc`:

GiYoM's avatar
GiYoM committed
789
```shell
GiYoM's avatar
GiYoM committed
790 791 792 793 794
    joe@moi:~/Info/1ere$ touch calcul.dat
    joe@moi:~/Info/1ere$ echo '2 + 3' > calcul.dat 
    joe@moi:~/Info/1ere$ bc -q calcul.dat
    5
    quit
GiYoM's avatar
GiYoM committed
795
```
GiYoM's avatar
GiYoM committed
796 797 798 799 800 801

Mis attend toujours une entrée.

Une autre façon de procéder consiste à mettre le fichier en entrée de
`bc`:

GiYoM's avatar
GiYoM committed
802
```shell
GiYoM's avatar
GiYoM committed
803 804 805
    joe@moi:~/Info/1ere$ bc -q < calcul.dat
    5
    joe@moi:~/Info/1ere$ 
GiYoM's avatar
GiYoM committed
806 807
```

GiYoM's avatar
GiYoM committed
808 809 810 811 812

Quelle différence?

Expliquez ce qui se passe ici:

GiYoM's avatar
GiYoM committed
813

GiYoM's avatar
GiYoM committed
814
```shell
GiYoM's avatar
GiYoM committed
815 816 817 818 819 820 821
    joe@moi:~/Info/1ere$ echo '2 + 4' > calcul.dat 
    joe@moi:~/Info/1ere$ echo 'quit' >> calcul.dat 
    joe@moi:~/Info/1ere$ bc -q < calcul.dat >> calcul.dat
    joe@moi:~/Info/1ere$ more calcul.dat 
    2 + 4
    quit
    6
GiYoM's avatar
GiYoM committed
822
```
GiYoM's avatar
GiYoM committed
823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839
Et si on avait oublié `quit`?

### Tubes

Pour bien être persuadé que le shell, c'est de la plomberie, nous allons
étudier les tubes (*pipes* in English). Il permettent de relier le flux
de sortie (*standard output*) d'une commande au flux d'entrée (*standard
input*) d'une autre.

Regarder l'aide de la commande `rev` et en particulier cette ligne:

    DESCRIPTION
           The  rev  utility copies the specified files to standard output, reversing the order of characters in every line.  If no files are speci‐
           fied, standard input is read.

et expliquez ce qui se passe:

GiYoM's avatar
GiYoM committed
840
```shell
GiYoM's avatar
GiYoM committed
841 842
    joe@moi:~$ echo 'Vive Zorglub' | rev
    bulgroZ eviV
GiYoM's avatar
GiYoM committed
843
```
GiYoM's avatar
GiYoM committed
844 845 846

Installons maintenant quelques outils très utiles:

GiYoM's avatar
GiYoM committed
847
```shell
GiYoM's avatar
GiYoM committed
848 849
joe@moi:~$ sudo apt-get install esound fortune cowsay
```
GiYoM's avatar
GiYoM committed
850 851 852

Puis observons:

GiYoM's avatar
GiYoM committed
853
```shell
GiYoM's avatar
GiYoM committed
854 855 856 857 858 859 860 861
    joe@moi:~$ fortune
    joe@moi:~$ fortune | cowsay
    joe@moi:~$ fortune | cowsay -f elephant
    joe@moi:~$ fortune | rev | cowsay 
    joe@moi:~$ espeak 'hello. My name is Joe'
    joe@moi:~$ date 
    joe@moi:~$ date "+It is %I %M %p."
    joe@moi:~$ date "+It is %I %M %p." | espeak
GiYoM's avatar
GiYoM committed
862
```
GiYoM's avatar
GiYoM committed
863 864 865

Il est temps de passer aux choses sérieuses

GiYoM's avatar
GiYoM committed
866
```shell
GiYoM's avatar
GiYoM committed
867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
    joe@moi:~$ fortune | rev | cowsay -f stegosaurus
     ___________________________________
    / .t'nod uoy sselnu suomaf dna hcir \
    \ emoceb lliw uoY                   /
     -----------------------------------
    \                             .       .
     \                           / `.   .' " 
      \                  .---.  <    > <    >  .---.
       \                 |    \  \ - ~ ~ - /  /    |
             _____          ..-~             ~-..-~
            |     |   \~~~\.'                    `./~~~/
           ---------   \__/                        \__/
          .'  O    \     /               /       \  " 
         (_____,    `._.'               |         }  \/~~~/
          `----.          /       }     |        /    \__/
                `-.      |       /      |       /      `. ,~~|
                    ~-.__|      /_ - ~ ^|      /- _      `..-'   
                         |     /        |     /     ~-.     `-. _  _  _
                         |_____|        |_____|         ~ - . _ _ _ _ _>
GiYoM's avatar
GiYoM committed
886
```
GiYoM's avatar
GiYoM committed
887 888 889 890 891 892 893 894 895 896 897

For
---

Bash dispose d'une structure de contrôle `for` qui a pour syntaxe:

`for` chaque variable `in` une liste`; do` commande 1 `;`
commande2`;`\...`; done`

Par exemple:

GiYoM's avatar
GiYoM committed
898
```shell
GiYoM's avatar
GiYoM committed
899
    joe@moi:~$ for fic in *.py; do echo "Fichier Python trouvé -> $fic"; done
GiYoM's avatar
GiYoM committed
900 901 902 903
    Fichier Python trouvé -> defi1.py
    Fichier Python trouvé -> defi2.py
    Fichier Python trouvé -> defi3.py
    Fichier Python trouvé -> defi4.py
GiYoM's avatar
GiYoM committed
904
```
GiYoM's avatar
GiYoM committed
905 906 907

Que font les deux lignes suivantes ?

GiYoM's avatar
GiYoM committed
908

GiYoM's avatar
GiYoM committed
909
```shell
GiYoM's avatar
GiYoM committed
910 911 912
    joe@moi:~$ for fic in $(find ~ -name '?*.?*'); do echo "du contenu" > $fic; done

    joe@moi:~$ mkdir ./Truc/Python; for fic in $(find ~ -name '*.py'); do mv $fic ~/Truc/Python; done
GiYoM's avatar
GiYoM committed
913
```
GiYoM's avatar
GiYoM committed
914 915 916 917 918 919

sort, cat
---------

Est-ce une sorte d'animal? Cherchez la réponse. Voici un exemple:

GiYoM's avatar
GiYoM committed
920
```shell
GiYoM's avatar
GiYoM committed
921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946
    joe@moi:~$ cat >> liste
    manger
    boire    
    dormir
    coder
    # Ici on tape sur C-d pour fermer le flux d'entrée (C comme Ctrl bien sûr)

    joe@moi:~$ cat liste
    manger
    boire
    dormir
    coder

    joe@moi:~$ sort < liste > liste_triee

    joe@moi:~$ cat liste
    manger
    boire
    dormir
    coder

    joe@moi:~$ cat liste_triee 
    boire
    coder
    dormir
    manger
GiYoM's avatar
GiYoM committed
947
```
GiYoM's avatar
GiYoM committed
948 949 950 951 952 953 954

Grep
----

Rechercher ce qu'est **grep**. Voici un exemple simple. Une autre
nouvelle commande se cache dans ces lignes: que fait-elle?

GiYoM's avatar
GiYoM committed
955
```shell
GiYoM's avatar
GiYoM committed
956 957 958 959 960 961 962 963 964 965 966 967 968 969
    joe@moi:~$ wget -O swann.txt https://www.gutenberg.org/files/2650/2650-0.txt

    joe@moi:~$ grep Title swann.txt 
    Title: Du Côté de Chez Swann

    joe@moi:~$ grep Author swann.txt 
    Author: Marcel Proust

    joe@moi:~$ grep -n  madeleine swann.txt 
    1613:j'avais laissé s'amollir un morceau de madeleine. Mais à l'instant
    1684:morceau de madeleine que le dimanche matin à Combray (parce que ce
    1688:petite madeleine ne m'avait rien rappelé avant que je n'y eusse goûté;
    1705:Et dès que j'eus reconnu le goût du morceau de madeleine trempé dans
    1871:fanée une petite madeleine dont elle me tendait un morceau quand il
GiYoM's avatar
GiYoM committed
970
```
GiYoM's avatar
GiYoM committed
971 972 973 974 975 976 977 978 979 980 981

L'utilisation de **grep** est bien plus riche. N'hésitez pas à explorer
la documentation.

Droits d'accès - Privilèges
---------------------------

### Lire les privilèges

Observons:

GiYoM's avatar
GiYoM committed
982
```shell
GiYoM's avatar
GiYoM committed
983 984 985 986 987 988 989 990 991 992 993 994
    joe@moi:~$ ls -l swann.txt 
    -rw-r--r-- 1 joe joe 1058697 Apr  8  2018 swann.txt

    joe@moi:~$ ls -l /usr/bin/thunderbird 
    -rwxr-xr-x 1 root root 10332 Sep 11 17:54 /usr/bin/thunderbird

    joe@moi:~$ ls -l /home/moi/bin/balai.sh 
    -rwxr-xr-x 1 moi moi 307 Aug 19  2018 /home/moi/bin/balai.sh

    oe@moi:~$ ls -l Truc
    total 4
    drwxr-xr-x 10 joe joe 4096 Oct  9 23:09 Python
GiYoM's avatar
GiYoM committed
995
```
GiYoM's avatar
GiYoM committed
996 997 998 999

Nous allons nous occuper des 10 premiers caractères. Le premier est un
**d** s'il s'agit d'un répertoire, rien ou plutôt un tiret si c'est un
ficher normalfg (il y a d'autres possibilités mais pas pour
GiYoM's avatar
GiYoM committed
1000
aujourd'hui...).
GiYoM's avatar
GiYoM committed
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010

Les trois suivants indiquent les droits pour le propriétaire, les trois
du milieu les droits du groupe et les trois derniers sont ceux du reste
du monde.

Les lettres possibles sont **r, w, x** et ont différentes signification
selon qu'il s'agit d'un fichier ou d'un répertoire.

##### Fichiers

GiYoM's avatar
GiYoM committed
1011
* **r**
GiYoM's avatar
GiYoM committed
1012 1013
:   autorise à lire le contenu des fichiers;

GiYoM's avatar
GiYoM committed
1014
* **w**
GiYoM's avatar
GiYoM committed
1015 1016
:   autorise à modifier un fichier;

GiYoM's avatar
GiYoM committed
1017
* **x**
GiYoM's avatar
GiYoM committed
1018 1019 1020 1021
:   autorise à exécuter un fichier.

##### Répertoires

GiYoM's avatar
GiYoM committed
1022
* **r**
GiYoM's avatar
GiYoM committed
1023 1024
:   autorise à lister les fichiers du répertoire;

GiYoM's avatar
GiYoM committed
1025
* **w**
GiYoM's avatar
GiYoM committed
1026 1027
:   autorise à déplacer ou supprimer des fichiers du répertoire;

GiYoM's avatar
GiYoM committed
1028
* **x**
GiYoM's avatar
GiYoM committed
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
:   autorise à avoir accès aux fichiers du répertoire.

### Changer les privilèges

On peut changer les privilèges avec **chmod destinataires mode droits**.

Les destinataires peuvent être **u**ser, **g**roup, **o**ther ou
**a**ll.

Les droits sont toujours **r, w, x**.

Les mode sont **+** pour ajouter les droits, **-** pour les enlever.

Par exemple:

GiYoM's avatar
GiYoM committed
1044
```shell
GiYoM's avatar
GiYoM committed
1045 1046 1047 1048 1049
    joe@moi:~$ ls -l swann.txt 
    -rw-r--r-- 1 joe joe 1058697 Apr  8  2018 swann.txt
    joe@moi:~$ chmod g+w swann.txt 
    joe@moi:~$ ls -l swann.txt 
    -rw-rw-r-- 1 joe joe 1058697 Apr  8  2018 swann.txt
GiYoM's avatar
GiYoM committed
1050
```
GiYoM's avatar
GiYoM committed
1051 1052 1053 1054 1055

### Droits numériques

On peut également coder les droits à l'aide de nombres :

GiYoM's avatar
GiYoM committed
1056

GiYoM's avatar
GiYoM committed
1057 1058 1059 1060 1061 1062
      rwx r-x --x
      111 101 001 <- codage en binaire
        7   5   1 <- codage en octal

Expliquez alors ce qui se passe:

GiYoM's avatar
GiYoM committed
1063

GiYoM's avatar
GiYoM committed
1064
```shell
GiYoM's avatar
GiYoM committed
1065 1066 1067 1068 1069
    joe@moi:~$ ls -l calcul.dat 
    -rw-r--r-- 1 joe joe 25673137 Oct 10 11:30 calcul.dat
    joe@moi:~$ chmod 751 calcul.dat 
    joe@moi:~$ ls -l calcul.dat 
    -rwxr-x--x 1 joe joe 25673137 Oct 10 11:30 calcul.dat
GiYoM's avatar
GiYoM committed
1070
```
GiYoM's avatar
GiYoM committed
1071 1072 1073 1074 1075 1076 1077

Compression, taille
-------------------

La commande **du** avec l'option **h** comme *humain* permet de
connaître la taille d'un fichier dans un format lisible par un humain:

GiYoM's avatar
GiYoM committed
1078
```shell
GiYoM's avatar
GiYoM committed
1079 1080
    joe@moi:~$ du -h swann.txt 
    1.1M    swann.txt
GiYoM's avatar
GiYoM committed
1081
```
GiYoM's avatar
GiYoM committed
1082 1083 1084

Ce fichier. Compressons-le:

GiYoM's avatar
GiYoM committed
1085
```shell
GiYoM's avatar
GiYoM committed
1086
    joe@moi:~$ gzip swann.txt 
GiYoM's avatar
GiYoM committed
1087
```
GiYoM's avatar
GiYoM committed
1088 1089 1090

Il prend moins de place:

GiYoM's avatar
GiYoM committed
1091
```shell
GiYoM's avatar
GiYoM committed
1092 1093
    joe@moi:~$ du -h swann.txt.gz 
    388K    swann.txt.gz
GiYoM's avatar
GiYoM committed
1094
```
GiYoM's avatar
GiYoM committed
1095 1096 1097

Décompressons:

GiYoM's avatar
GiYoM committed
1098
```shell
GiYoM's avatar
GiYoM committed
1099
    joe@moi:~$ gunzip swann.txt.gz 
GiYoM's avatar
GiYoM committed
1100
```
GiYoM's avatar
GiYoM committed
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113

Script Bash
-----------

### Découverte: script avec argument

Outre les commandes existantes, l'utilisateur d'un shell peut créer ses
propres programmes appelés des *scripts* et sont stockés dans des
fichiers d'extension `.sh`.

Voyons par exemple cette suite de commandes qui permet de convertir un
fichier son au format `midi` en un fichier au format `mp3`:

GiYoM's avatar
GiYoM committed
1114
```shell
GiYoM's avatar
GiYoM committed
1115 1116 1117
    $ timidity -Ow musique.midi
    $ lame  -V2 musique.wav  musique.mp3
    $ rm musique.wav
GiYoM's avatar
GiYoM committed
1118
```
GiYoM's avatar
GiYoM committed
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167

Voici un extrait du manuel de `timidity`:

    DESCRIPTION
           TiMidity++  is a converter that converts some of MIDI files (supported formats:
           Standard MIDI files (*.mid), Recomposer files (*.rcp, *.r36, *.g18, *.g36)  and
           Module  files (*.mod)) into formatted audio files (e.g. RIFF WAVE).

       -Ow    Generate RIFF WAVE format output. 

Voici un extrait de la description de `lame`:

    DESCRIPTION
           LAME  is  a  program which can be used to create compressed audio files.  (Lame
           ain't an MP3 encoder).

et de l'une de ses options:

        -V n   0 <= n <= 9.999
                  Enable VBR (Variable BitRate) and specifies the  value  of  VBR  quality
                  (default = 4). Decimal values can be specified, like 4.51.
                  0 = highest quality.
     

Mais si nous avons souvent besoin de convertir des fichiers `midi` en
fichiers `mp3` il peut apparaître fastidieux de réécrire ces trois
lignes à chaque fois.

On va donc créer un script `bash` qui va prendre le nom du fichier
`midi` à convertir en argument et effectuer les trois opérations en
arrière-plan.

On va ouvrir un éditeur, par exemple `nano` dont voici la description:

    DESCRIPTION
           nano is a small and friendly editor.  It copies the look and feel of Pico,
           but is free software, and  implements  several  features  that Pico  lacks,
           such as: opening multiple files, scrolling per line, undo/redo, syntax coloring,
           line numbering, and soft-wrapping overlong lines.

           When giving a filename on the command line, the cursor can be put on a specific
           line by adding the line number with a plus sign  (+)  before the filename, and
           even in a specific column by adding it with a comma.

           As a special case: if instead of a filename a dash (-) is given, nano will read
           data from standard input.

On lance `nano` et on crée un fichier `midi2mp3.sh`:

GiYoM's avatar
GiYoM committed
1168
```shell
GiYoM's avatar
GiYoM committed
1169
    $ nano midi2mp3.sh
GiYoM's avatar
GiYoM committed
1170
```
GiYoM's avatar
GiYoM committed
1171 1172 1173

et on entre ceci:

GiYoM's avatar
GiYoM committed
1174

GiYoM's avatar
GiYoM committed
1175
```shell
GiYoM's avatar
GiYoM committed
1176 1177 1178 1179
    #! /bin/bash
    # Ce scripts permet de convertir un fichier midi en mp3

    timidity -Ow $1.midi && lame  -V2 $1.wav  $1.mp3 && rm $1.wav
GiYoM's avatar
GiYoM committed
1180
```
GiYoM's avatar
GiYoM committed
1181

GiYoM's avatar
GiYoM committed
1182 1183 1184
Le `$1` dénote le premier argument entré qui sera ici le nom du fichier. On
utilisera de même  `$2`, `$3`, etc. Mais aussi `$*`  qui contient l'ensemble des
arguments et `$#` qui contient le nombre d'arguments.
GiYoM's avatar
GiYoM committed
1185 1186 1187 1188

La double esperluette permet d'effectuer différents processus les uns à
la suite des autres dans le même terminal.

GiYoM's avatar
GiYoM committed
1189
On enregistre le fichier en tapant `Ctrl`-`X` et on quitte ainsi nano.
GiYoM's avatar
GiYoM committed
1190

GiYoM's avatar
GiYoM committed
1191 1192 1193
Il faut ensuite **rendre exécutable** ce fichier, nous avons déjà vu
comment:

GiYoM's avatar
GiYoM committed
1194
```shell
GiYoM's avatar
GiYoM committed
1195
    $ chmod +x midi2mp3.sh 
GiYoM's avatar
GiYoM committed
1196
```
GiYoM's avatar
GiYoM committed
1197 1198 1199 1200

Puis on peut lancer le script qui est maintenant un exécutable, en
demandant de convertir le fichier `demo.midi`:

GiYoM's avatar
GiYoM committed
1201

GiYoM's avatar
GiYoM committed
1202
```shell
GiYoM's avatar
GiYoM committed
1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213
    $ ./midi2mp3.sh demo

    Playing demo.midi
    MIDI file: demo.midi
    Format: 1  Tracks: 1  Divisions: 128
    Output demo.wav
    Playing time: ~18 seconds
    Notes cut: 0
    Notes lost totally: 0
    LAME 3.100 64bits (http://lame.sf.net)
    Encoding demo.wav to demo.mp3
GiYoM's avatar
GiYoM committed
1214
```
GiYoM's avatar
GiYoM committed
1215 1216 1217

Et voilà:

GiYoM's avatar
GiYoM committed
1218
```shell
GiYoM's avatar
GiYoM committed
1219 1220
    $ ls
    demo.midi midi2mp3.sh Truc calcul.dat demo.mp3
GiYoM's avatar
GiYoM committed
1221
```
GiYoM's avatar
GiYoM committed
1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235

### Script avec interaction

Nous allons découvrir qui permet de convertir des fichiers image en
différents formats:

    OVERVIEW
           The convert program is a member of the ImageMagick suite of tools.
           Use it to convert between image formats as well as resize an image,
           blur, crop, despeckle, dither, draw on, flip, join, re-sample,
           and much more.

Voici le script:

GiYoM's avatar
GiYoM committed
1236

GiYoM's avatar
GiYoM committed
1237
```shell
GiYoM's avatar
GiYoM committed
1238 1239 1240 1241 1242 1243 1244 1245 1246 1247
    #! /bin/sh

    mkdir -p small

    read -p "Quel est l'extension des fichiers ?" ext
    read -p "Quel est le ratio en pourcentage ?" rat

    for file in  *.$ext;
       do convert $file -resize $rat% small/$file;
    done;
GiYoM's avatar
GiYoM committed
1248 1249
```

GiYoM's avatar
GiYoM committed
1250 1251 1252 1253 1254

Pouvez-vous l'expliquer?

Voici un exemple d'utilisation:

GiYoM's avatar
GiYoM committed
1255

GiYoM's avatar
GiYoM committed
1256
```shell
GiYoM's avatar
GiYoM committed
1257
    $ ../reduitImages.sh 
GiYoM's avatar
GiYoM committed
1258
    Quel est l extension des fichiers ? jpg
GiYoM's avatar
GiYoM committed
1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270
    Quel est le ratio en pourcentage ? 50

    $ ls -l 
    total 100
    -rw-r--r-- 1 joe joe 20400 Oct 12 23:32 mario.jpg
    -rw-r--r-- 1 joe joe 73733 Oct  7 21:55 Mario.jpg
    drwxr-xr-x 2 joe joe  4096 Oct 12 23:33 small

    $ ls -l small
    total 36
    -rw-r--r-- 1 joe joe  9343 Oct 12 23:33 mario.jpg
    -rw-r--r-- 1 joe joe 24485 Oct 12 23:33 Mario.jpg
GiYoM's avatar
GiYoM committed