workshop_shell
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
workshop_shell [2023/11/04 09:42] – bigMax | workshop_shell [2024/03/20 12:56] (Version actuelle) – bigMax | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
< | < | ||
- | # Workshop Shell Unix (Interpréteur de commandes) | + | # Workshop Shell Unix compatible |
## Guidelines pour l' | ## Guidelines pour l' | ||
Ligne 24: | Ligne 24: | ||
- ... | - ... | ||
- | ### Anatomie | + | ### Présentation |
- | COMMANDE ARGUMENT_1 ... ARGUMENT_N | + | **COMMANDE** |
+ | |||
+ | Retourne un " | ||
+ | - RC = 0 indique que tout s'est bien déroulé. | ||
+ | - RC > 0 indique qu'une erreur s'est produite. | ||
## Navigation dans un FS (système de fichiers) : pwd ; cd ; ls | ## Navigation dans un FS (système de fichiers) : pwd ; cd ; ls | ||
*Présentation avec GUI ouvert.* | *Présentation avec GUI ouvert.* | ||
+ | - pwd: print working directory | ||
+ | - cd: change directory | ||
+ | - ls: list | ||
+ | |||
``` bash | ``` bash | ||
pwd | pwd | ||
Ligne 46: | Ligne 54: | ||
## Manipulation des fichiers : touch ; cp ; mv ; rm ; mkdir | ## Manipulation des fichiers : touch ; cp ; mv ; rm ; mkdir | ||
*Présentation avec GUI ouvert.* | *Présentation avec GUI ouvert.* | ||
+ | - touch: touche un fichier (le créé si il n' | ||
+ | - cp: copy files | ||
+ | - mv: move files | ||
+ | - rm: remove files | ||
+ | - mkdir: make directory | ||
+ | |||
``` bash | ``` bash | ||
touch foo | touch foo | ||
Ligne 57: | Ligne 71: | ||
## Permissions des fichiers : ls -l ; chmod ; chown | ## Permissions des fichiers : ls -l ; chmod ; chown | ||
+ | - chmod: change file mode | ||
+ | - chown: change file owner | ||
``` bash | ``` bash | ||
ls -l foo | ls -l foo | ||
Ligne 80: | Ligne 96: | ||
## Administration : ps ; top ; du ; df ; free ; mount | ## Administration : ps ; top ; du ; df ; free ; mount | ||
+ | - id: display user id | ||
+ | - last: display last logged in users | ||
+ | - ps: list process | ||
+ | - top: display top process | ||
+ | - du: disk usage | ||
+ | - df: disk free | ||
+ | - free: display RAM infos | ||
+ | - mount: display mounted file systems | ||
``` bash | ``` bash | ||
id | id | ||
Ligne 91: | Ligne 115: | ||
free -h | free -h | ||
mount | mount | ||
+ | ``` | ||
+ | |||
+ | ## Quelques autres commandes basiques | ||
+ | - echo: imprime les arguments sur la sortie standard (l' | ||
+ | - cat: concatene des fichiers et les imprime sur la sortie standard (l' | ||
+ | - read: lit l' | ||
+ | - which: localise le chemin absolu d'une commande | ||
+ | - grep: imprime les lignes d'un fichier qui match un pattern | ||
+ | - cut: extrait des colonnes d'un fichier | ||
+ | - paste: fusionne des lignes d'un ichier | ||
+ | |||
+ | ## Historique des commandes | ||
+ | ``` bash | ||
+ | history | ||
+ | ``` | ||
+ | On peut utiliser les fleches haut et bas du clavier pour parcourir l' | ||
+ | |||
+ | **Avec la combinaison de touch [CTRL]-[R] on peut rechercher dans l' | ||
+ | |||
+ | Avec la variable d' | ||
+ | ``` bash | ||
+ | echo " | ||
+ | HISTCONTROL=ignoreboth | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | history 10 | ||
+ | ``` | ||
+ | |||
+ | Généralement la commande history à des options pour allez supprimer des entrées dans l' | ||
+ | ``` bash | ||
+ | help history | ||
+ | echo "mon secret" | ||
+ | history 5 | ||
+ | history -d -3 | ||
+ | history 5 | ||
``` | ``` | ||
Ligne 106: | Ligne 166: | ||
``` | ``` | ||
- | ## IO (Entrées Sorties) (redirection / pipelines) : > >> < << | + | ## IO (Entrées Sorties) (redirection / pipelines) : 2> > >> | |
- | **TODO**: Utiliser | + | |
+ | ### Configuration par défaut de STDIN STDOUT et STDERR | ||
+ | Tous les programmes : | ||
+ | - lisent leur entrée sur le canal STDIN (entrée standard) | ||
+ | - écrivent sur le canal STDOUT (sortie standard) | ||
+ | - informe des érreurs sur le canal STDERR (sortie d' | ||
+ | |||
+ | Par défaut : | ||
+ | - STDIN est relié au " | ||
+ | - STDOUT et STDERR sont reliés à " | ||
+ | |||
+ | </ | ||
+ | {{ :: | ||
+ | < | ||
+ | |||
+ | ### Suppression | ||
+ | ``` bash | ||
+ | rm bar ; echo $? | ||
+ | rm bar 2> /dev/null ; echo $? | ||
+ | ``` | ||
### Ecriture dans fichier : > | ### Ecriture dans fichier : > | ||
``` bash | ``` bash | ||
Ligne 126: | Ligne 206: | ||
``` | ``` | ||
- | ### Rediriger | + | ### Lire un fichier sur l' |
Lecture de l' | Lecture de l' | ||
``` bash | ``` bash | ||
Ligne 132: | Ligne 212: | ||
echo "Hello world !" > foo | echo "Hello world !" > foo | ||
read txt < foo ; echo " | read txt < foo ; echo " | ||
+ | ``` | ||
+ | |||
+ | ### Ne pas interrompre la lecture de l' | ||
+ | ``` bash | ||
+ | cat << EOF | ||
+ | foo | ||
+ | bar | ||
+ | baz | ||
+ | EOF | ||
``` | ``` | ||
Ligne 148: | Ligne 237: | ||
### Pipeline (chaîner des programmes) : | | ### Pipeline (chaîner des programmes) : | | ||
+ | " | ||
+ | |||
``` bash | ``` bash | ||
cat bar | grep " | cat bar | grep " | ||
``` | ``` | ||
- | ## Logique : ; && || | + | </ |
+ | {{ :: | ||
+ | < | ||
+ | |||
+ | ## Logique : ; && || ! | ||
``` bash | ``` bash | ||
echo " | echo " | ||
Ligne 158: | Ligne 253: | ||
echo " | echo " | ||
false ; echo " | false ; echo " | ||
+ | ! false ; echo " | ||
true || echo " | true || echo " | ||
false || echo " | false || echo " | ||
Ligne 173: | Ligne 269: | ||
echo '" | echo '" | ||
echo "' | echo "' | ||
+ | echo " | ||
+ | echo " | ||
+ | echo ${USER^^} | ||
+ | TOUT_EN_MAJ=" | ||
export | export | ||
echo $PS1 | echo $PS1 | ||
Ligne 179: | Ligne 279: | ||
``` | ``` | ||
Il existe une priorité entre simple et double quotte. Une variable ne sera jamais interprété entre simple quottes sauf si englobé entre double quottes. | Il existe une priorité entre simple et double quotte. Une variable ne sera jamais interprété entre simple quottes sauf si englobé entre double quottes. | ||
+ | |||
+ | ## Bloc de commandes : { cmd1 ; cmd2 ; ... ; cmdN ; } ( cmd1 ; cmd2 ; ... ; cmdN ) | ||
+ | - Le bloc () est exécuté dans un sous processus. | ||
+ | - Le bloc {} doit se terminer par un ; | ||
+ | ``` bash | ||
+ | false || ( echo foo ; echo bar ; var=baz ) ; echo $var | ||
+ | false || { echo foo ; echo bar ; var=baz ; } ; echo $var | ||
+ | ``` | ||
## Un peu de recul : execution des commandes | ## Un peu de recul : execution des commandes | ||
Ligne 203: | Ligne 311: | ||
``` | ``` | ||
- | ## Scripts : philosophie tests loops fonctions | + | ## Scripts : philosophie tests loops fonctions |
- | + | ||
- | ### Fil rouge : un script pour trier ses photos | + | |
- | - variables | + | |
- | - conditions | + | |
- | - fonctions | + | |
- | - boucles | + | |
- | - return code (exit) | + | |
### Philosophie UNIX | ### Philosophie UNIX | ||
Ligne 217: | Ligne 318: | ||
- Écrivez des programmes pour gérer des flux de texte [en pratique des flux d' | - Écrivez des programmes pour gérer des flux de texte [en pratique des flux d' | ||
+ | ### Fil rouge : un script pour trier et compresser ses photos | ||
+ | - shebang | ||
+ | - fonctions | ||
+ | - return code (exit) | ||
+ | - arguments | ||
+ | - variables | ||
+ | - conditions | ||
+ | - boucles | ||
+ | |||
+ | Pour installer les packages nécéssaires sur debian/ | ||
+ | ``` bash | ||
+ | sudo apt install imagemagick exiftool | ||
+ | ``` | ||
+ | |||
+ | ### Initialisation du script : shebang usage() | ||
+ | - Nous éditons un nouveau fichier texte que nous allons " | ||
+ | - Première ligne du script : le shebang, qui indique à notre interpreteur que ce fichier est un script et quel interpreteur utiliser pour executer le script. | ||
+ | - Définition d'une fonction **usage()** pour guider l' | ||
+ | |||
+ | ``` bash | ||
+ | vim gere_mes_photos.sh | ||
+ | |||
+ | #! /bin/bash | ||
+ | |||
+ | usage() { | ||
+ | >&2 echo " | ||
+ | >&2 echo " | ||
+ | exit 1 | ||
+ | } | ||
+ | |||
+ | >&2 echo " | ||
+ | |||
+ | ./ | ||
+ | chmod u+x gere_mes_photos.sh | ||
+ | ./ | ||
+ | ``` | ||
+ | |||
+ | ### Tester les arguments en entrée : test | ||
+ | Un programme prend en paramètre des arguments séparés par des espaces (par défaut). | ||
+ | |||
+ | On vérifie que l' | ||
+ | On enrobe la variable $1 de double quottes ("" | ||
+ | ``` bash | ||
+ | test -n " | ||
+ | test -n " | ||
+ | |||
+ | ./ | ||
+ | |||
+ | ./ | ||
+ | ``` | ||
+ | |||
+ | ### Traiter chaque fichier fournit en entrée : for do done ; while do done ; les variables | ||
+ | On utilise une boucle pour parser tous les arguments un par un. | ||
+ | ``` bash | ||
+ | for file in " | ||
+ | >&2 echo " | ||
+ | done | ||
+ | ``` | ||
+ | |||
+ | ### Utiliser un bloc conditionnel : if then elif else | ||
+ | On peut utiliser un bloc conditionnel pour effectuer un traitement. | ||
+ | ``` bash | ||
+ | if ! [ -f " | ||
+ | usage " | ||
+ | fi | ||
+ | | ||
+ | ./ | ||
+ | ``` | ||
+ | |||
+ | ### Executer nos 2 programmes sur chaque fichier | ||
+ | - On utilise le programme exiftool pour renommer notre image en utilisant la metadata "date de création" | ||
+ | - On utilise le programme convert pour resize notre image. | ||
+ | |||
+ | ``` bash | ||
+ | tmpFile=" | ||
+ | >&2 echo " | ||
+ | convert -resize 50% " | ||
+ | |||
+ | >&2 echo " | ||
+ | exiftool ' | ||
+ | rm -- " | ||
+ | ``` | ||
+ | |||
+ | ### Script complet | ||
+ | ``` bash | ||
+ | #! /bin/sh | ||
+ | |||
+ | usage() { | ||
+ | >&2 echo " | ||
+ | >&2 echo " | ||
+ | exit 1 | ||
+ | } | ||
+ | |||
+ | test -n " | ||
+ | |||
+ | for file in " | ||
+ | >&2 echo " | ||
+ | |||
+ | if ! [ -f " | ||
+ | usage " | ||
+ | fi | ||
+ | |||
+ | tmpFile=" | ||
+ | >&2 echo " | ||
+ | convert -resize 50% " | ||
+ | |||
+ | >&2 echo " | ||
+ | exiftool ' | ||
+ | rm -- " | ||
+ | done | ||
+ | ``` | ||
+ | |||
+ | ## Retours | ||
+ | - Si focus sur les scripts, ne pas présenter les trucs non nécéssaires pour les scripts | ||
+ | - permissions ? | ||
+ | - admin ? | ||
+ | - files ? | ||
+ | - tldr comme manuel express ? | ||
</ | </ |
workshop_shell.1699090962.txt.gz · Dernière modification : 2023/11/04 09:42 de bigMax