s/culture-unix/gnu-linux-initiation/

This commit is contained in:
Julien Palard 2023-05-16 09:19:15 +02:00
parent a2926df93e
commit 17859ee616
Signed by: mdk
GPG Key ID: 0EFC1AC1006886F8
2 changed files with 282 additions and 96 deletions

View File

@ -1,48 +1,140 @@
# Le terminal et le shell
# GNU/Linux avec Debian
## Le vocabulaire
## Présenté
Expliquer le vocabulaire : shell, terminal, émulateur de terminal,
tout en autaurisant les abus de langages (si un élève parle de
terminal au lieu de shell ou vice-versa, aucun souci, on le fait
tous).
par
Pour le rôle du terminal, donner en exemple :
Julien Palard <julien@palard.fr>
=> https://mdk.fr/blog/how-apt-does-its-fancy-progress-bar.html
https://mdk.fr
Pour le rôle du shell, donner en exemple l'auto-complétion de bash.
::: notes
Expliquer le vocabulaire *commande*, *programme*, *argument* :
C'est très flou, pour un débutant, que lorsqu'il tape `ls /`, `ls` est
un programme, `/` et un argument, je pense que dans les yeux du
débutant ce sont « deux trucs qui vont bien ensemble ». Pour
approfondir un peu plus on peut doucement discerner builtin et
programme.
Introduce yourself!
## La philosophie Unix
# Avant de commencer
### Write programs that do one thing and do it well.
## Qui utilise GNU/Linux ?
Environ 3000 programmes différents dans mon dossier `/bin` sur une
Debian, heureusement leur utilisation suit une loi de Ziph :
- 500 des 500 plus gros supercalculateurs,
- 80% des serveurs exposés sur Internet,
- 42% des clients accédant à Internet,
- les télévisions, montres, voitures, l'ISS,
- Google, Amazon, Facebook, Apple, Wikipedia,
- la gendarmerie, le parlement, le ministère de l'agriculture…
$ history | awk '{print $2}' | sort | uniq -c | sort -gr
1088 git
634 fg
317 cd
293 emacs
239 ls
201 python
119 ssh
113 flake8
104 curl
...
L'idée ici est de réutiliser le code au maximum, un exemple typique :
la recherche dans un fichier.
# Les environnements de bureau
## KDE
<img src="https://upload.wikimedia.org/wikipedia/commons/d/d9/KDE_1.0.png" style="width: 80%"/>
## KDE
![](https://upload.wikimedia.org/wikipedia/commons/a/a9/KDE_Plasma_5.16.png)
## GNOME
<video controls=1 src="https://static.gnome.org/release/42/appearance.webm"/>
## Phosh
<img src="https://upload.wikimedia.org/wikipedia/commons/6/6f/Phosh_on_PinePhone.png" style="width: 30%"/>
# Le shell
![](static/shell.png)
## Les commandes
On exécute des « commandes » ou des « programmes ».
Ces programmes peuvent prendre des « arguments » ou des « paramètres ».
## Le shell
Dans :
```bash
$ date
```
- `$ ` est « le prompt », il n'est pas éditable.
- `date` est un programme.
notes:
Oui le prompt est modifiable, je veux dire qu'on ne peut pas l'effacer
avec backspace.
## Le shell
Dans :
```bash
$ man intro
```
- `man` est un programme.
- `intro` est un `argument` qui lui est donné.
## Le shell
Mais pourquoi !?
## Le shell
- C'est plus rapide.
- Ça permet de faire collaborer plusieurs programmes.
- C'est à la portée de tout développeur d'ajouter un programme en quelques minutes.
## C'est plus rapide
- Dû à la simplicité de l'interface.
- L'auto-complétion des commandes et parfois de leurs arguments.
- Les raccourcis claviers.
- La quantité de programmes disponnibles (~4500 chez moi, là).
notes: démo ! Ctrl-r !
## Kit de survie
- `pwd`
- `cd`
- `ls`
- `cp`, `mv`
- `rm`
- `mkdir`
notes: Il n'y a pas de corbeille !
## Kit de survie
- `less`, `see`, `edit`
- `man`
- `grep`
- `find`
# La philosophie Unix
> Write programs that do one thing and do it well.
Notes:
L'idée ici est d'éviter de dupliquer du code. Ne l'écrire qu'une fois, mais bien.
Un exemple typique : la recherche dans un fichier.
Dans un contexte unix, un seul outil sert à chercher du texte dans un fichier : `grep`.
@ -62,8 +154,11 @@ C'est de nombreuses heures de perdues, à réimplémenter inlassablement
la même fonctionalité.
### Write programs to work together.
## La philosophie Unix
> Write programs to work together.
notes:
Pour pouvoir réutiliser un programme il faut qu'il s'interface
correctement avec les autres :
@ -71,8 +166,11 @@ correctement avec les autres :
- Un programme doit comprendre facilement le dialecte d'un autre.
### Write programs to handle text streams, because that is a universal interface.
## La philosophie Unix
> Write programs to handle text streams, because that is a universal interface.
notes:
Parler de l'omniprésence du texte brut (de Markdown à HTTP/1.1 en
passant par les fichiers source), en opposition aux formats binaires
(sortis d'éditeurs comme Word, ...). (Je ne veux plus voir des
@ -82,84 +180,172 @@ code.)
Digrésser sur Markdown et reStructuredText, mentionner groff.
### Everything is a file.
# Le shell, démos
Un disque dur est un fichier, une clef USB est un fichier, ma batterie
est un fichier, ma souris est un fichier...
Voici les programmes que j'utilise le plus :
$ history | awk '{print $2}' | sort | uniq -c | sort -gr
3408 git
902 cd
765 python
539 ls
385 emacs
330 curl
327 ssh
291 make
209 mv
188 rm
...
### Philosophie UNIX
## Démo
C'est le moment de commencer les démos et explications des commandes
élémentaires qui sont l'implémentation de la philosophie UNIX :
Pour jouer un peu avec le shell, on va utiliser [Open Food
Facts](https://www.data.gouv.fr/fr/datasets/open-food-facts-produits-alimentaires-ingredients-nutrition-labels/#resource-164c9e57-32a7-4f5b-8891-26af10f91072).
- pwd
- cd
- ls
- cp, mv
- rm (leur rappeler qu'il n'y a pas de « corbeille »)
- mkdir (et rmdir)
- less (leur apprendre à *q*uitter ! Rien n'est pas une évidence.)
- man (`man intro`, `man man`, `man ls`, `man cp`, ...)
- l'historique (`history`, pavé directionnel, ctrl-r, ça suffit pour le moment)
- grep
- find
C'est un fichier de produits alimentaires.
Pour faire des exemples, on peut par exemple utiliser
[fr.openfoodfacts.org.products.csv](https://www.data.gouv.fr/fr/datasets/open-food-facts-produits-alimentaires-ingredients-nutrition-labels/#resource-164c9e57-32a7-4f5b-8891-26af10f91072).
## Démo
Téléchargeons et décompressons le fichier :
```bash
$ wc -l fr.openfoodfacts.org.products.csv
1486053 fr.openfoodfacts.org.products.csv
$ curl -O https://fr.openfoodfacts.org/data/fr.openfoodfacts.org.products.csv.gz
$ gunzip fr.openfoodfacts.org.products.csv.gz
$ mv fr.openfoodfacts.org.products.csv products.csv
```
$ file fr.openfoodfacts.org.products.csv
fr.openfoodfacts.org.products.csv: UTF-8 Unicode text, with very long lines
Attention, compressé il fait ~700M, décompressé ~8GB.
$ less fr.openfoodfacts.org.products.csv
$ head fr.openfoodfacts.org.products.csv
## Démo
Peser le fichier :
```bash
$ du -h products.csv
7.8G products.csv
```
## Démo
Compter les lignes :
```bash
$ wc -l products.csv
2864834 products.csv
```
## Démo
Obtenir des informations sur le contenu du fichier :
```bash
$ file products.csv
products.csv: UTF-8 Unicode text,
with very long lines
```
## Démo
Lire le fichier :
```bash
$ less products.csv
```
Attention le fichier est gigantesque !
## Démo
Obtenir les 10 premières lignes du fichier :
```bash
$ head products.csv
code url creator created_t created_datetime ... ...
00000000000000225 http://world-fr.openfoodfacts.org/produit/00000000000000225/jeunes-pousses-endives...
0000000000000207025004 http://world-fr.openfoodfacts.org/produit/0000000000000207025004/andre...
...
# Les noms des colonnes
$ head -n 1 fr.openfoodfacts.org.products.csv | tr '\t' '\n'
$ grep --color E431 fr.openfoodfacts.org.products.csv
...
$ grep --color E431 fr.openfoodfacts.org.products.csv | wc -l
5
$ grep --color E100 fr.openfoodfacts.org.products.csv | wc -l
5733
$ grep -oE 'E[0-9]{3}' fr.openfoodfacts.org.products.csv | sort | uniq -c | sort -gr | head
167170 E322
132029 E330
79081 E500
54024 E160
50842 E415
47528 E471
44851 E450
39896 E150
39629 E202
38945 E412
# Les marques les plus / les moins représentée
$ cut -f14 fr.openfoodfacts.org.products.csv | sort | uniq -c | sort -gr | head
660855
13160 Carrefour
10902 Auchan
...
```
Ou faire quelques exemples simples, par exemple sur un fichier README
afficher les titres:
grep '^#' README.md
## Les noms des colonnes
## ssh
```bash
$ head -n 1 products.csv | tr '\t' '\n'
code
url
creator
created_t
created_datetime
```
## Le nombre de colonnes
```bash
$ head -n 1 products.csv |
> tr '\t' '\n' | wc -l
201
```
Parmis les colonnes je repère `additives`...
## Les numéros des colonnes
```bash
$ head -n 1 products.csv |
> tr '\t' '\n'| grep -n additives
51:additives_n
52:additives
53:additives_tags
54:additives_fr
```
## Les additifs
```bash
cut -f 51-54 products.csv | less
```
Je repère « E412 », je me demande si beaucoup de produits l'utilisent…
## Les additifs
```bash
$ cut -f 51-54 products.csv |
> grep -c E412
44554
```
Je me demande quel est l'additif le plus utilisé…
## Les additifs
```bash
$ cut -f 51-54 products.csv |
> grep -oE 'E[0-9]{3}' | sort | uniq -c | sort -gr | head
196667 E322
153420 E330
114926 E500
61884 E160
56411 E415
54712 E450
49713 E471
44554 E412
44121 E202
42398 E150
```
# ssh
SSH: Parler de clefs, conseiller ED25519