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 01:00] – bigMax | workshop_shell [2024/03/20 12:56] (Version actuelle) – bigMax | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
< | < | ||
- | # Workshop Shell Unix | + | # Workshop Shell Unix compatible (Interpréteur de commandes) |
## Guidelines pour l' | ## Guidelines pour l' | ||
Ligne 9: | Ligne 9: | ||
## Intro: shell / terminal | ## Intro: shell / terminal | ||
+ | On désigne souvent le shell par : | ||
+ | - le terminal | ||
+ | - la console | ||
+ | - le shell | ||
+ | - le bash | ||
- | ## Navigation : pwd ; cd ; ls | + | Le shell Unix est une Interface en Ligne de Commande (CLI) qui permet à un utilisateur d’interagir avec un système d' |
+ | |||
+ | ### Exemples de shell | ||
+ | - sh (Bourne shell) le plus répendu | ||
+ | - bash (Bourn again shell) le plus populaire ? | ||
+ | - zsh le plus geek ? | ||
+ | - ksh (Korn shell) | ||
+ | - ... | ||
+ | |||
+ | ### Présentation d'une ligne de commande | ||
+ | **COMMANDE** | ||
+ | |||
+ | Retourne un " | ||
+ | - RC = 0 indique que tout s'est bien déroulé. | ||
+ | - RC > 0 indique qu'une erreur s'est produite. | ||
+ | |||
+ | ## Navigation | ||
*Présentation avec GUI ouvert.* | *Présentation avec GUI ouvert.* | ||
+ | - pwd: print working directory | ||
+ | - cd: change directory | ||
+ | - ls: list | ||
+ | |||
``` bash | ``` bash | ||
pwd | pwd | ||
Ligne 17: | Ligne 42: | ||
pwd | pwd | ||
cd | cd | ||
+ | pwd | ||
+ | cd - | ||
+ | pwd | ||
+ | cd | ||
+ | cd ~ | ||
pwd | pwd | ||
ls | ls | ||
Ligne 22: | Ligne 52: | ||
``` | ``` | ||
- | ## Fichiers | + | ## Manipulation des fichiers |
*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 34: | Ligne 70: | ||
``` | ``` | ||
- | ## Permissions : ls -l ; chmod ; chown | + | ## Permissions |
+ | - chmod: change file mode | ||
+ | - chown: change file owner | ||
``` bash | ``` bash | ||
ls -l foo | ls -l foo | ||
Ligne 43: | Ligne 81: | ||
``` | ``` | ||
- | ## Obtenir de l'aide : help ; man | + | ## Obtenir de l'aide : man ; help |
- | La commande help permet d' | + | |
- | ``` bash | + | |
- | help | + | |
- | ``` | + | |
La commande man permet d' | La commande man permet d' | ||
``` bash | ``` bash | ||
man man | man man | ||
+ | ``` | ||
+ | |||
+ | L'aide des commandes internes au shell n'est pas disponible dans le manuel man. La commande help permet d' | ||
+ | Cette commande n'est pas disponible dans tous les shell : sur zsh elle est remplacée par run-help. | ||
+ | ``` bash | ||
+ | help | ||
+ | help cd | ||
``` | ``` | ||
## 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 69: | Ligne 117: | ||
``` | ``` | ||
- | ## Expansion : * ? ~ {1..5} {Z..A} | + | ## Quelques autres commandes basiques |
- | TODO : Attention les expansions dependent beaucoup du shell (sh, bash, zsh, ...) | + | - 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 | ||
+ | ``` | ||
+ | |||
+ | ## Expansion : * ? ~ {1..5} {Z..A} | ||
+ | Attention les expansions dependent beaucoup du shell (sh, bash, zsh, ...) | ||
+ | L' | ||
``` bash | ``` bash | ||
rm -rf work1 ; mkdir work1 ; cd work1 | rm -rf work1 ; mkdir work1 ; cd work1 | ||
Ligne 78: | Ligne 164: | ||
ls b?z | ls b?z | ||
echo {A..C} | echo {A..C} | ||
- | echo $USER | ||
``` | ``` | ||
- | ## IO (Entrées Sorties) | + | ## IO (Entrées Sorties) |
- | TODO: Utiliser | + | |
- | ### Ecriture dans fichier | + | ### 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 | ||
+ | |||
+ | Par défaut : | ||
+ | - STDIN est relié au " | ||
+ | - STDOUT et STDERR sont reliés à " | ||
+ | |||
+ | </ | ||
+ | {{ :: | ||
+ | < | ||
+ | |||
+ | ### Suppression des erreurs : 2> /dev/null | ||
+ | ``` bash | ||
+ | rm bar ; echo $? | ||
+ | rm bar 2> /dev/null ; echo $? | ||
+ | ``` | ||
+ | |||
+ | ### Ecriture dans fichier | ||
``` bash | ``` bash | ||
rm -rf work2 ; mkdir work2 ; cd work2 | rm -rf work2 ; mkdir work2 ; cd work2 | ||
Ligne 92: | Ligne 197: | ||
``` | ``` | ||
- | ### Ecrire à la fin d'un fichier | + | ### Ecrire à la fin d'un fichier |
``` bash | ``` bash | ||
> bar | > bar | ||
Ligne 101: | Ligne 206: | ||
``` | ``` | ||
- | ### Ecrire | + | ### Lire un fichier |
+ | Lecture de l'entrée depuis un fichier. | ||
``` bash | ``` bash | ||
- | echo "sur la sortie standard" | + | read txt ; echo "$txt" |
- | >& | + | echo "Hello world !" |
+ | read txt < foo ; echo "$txt" | ||
``` | ``` | ||
- | ### Rediriger | + | ### Ne pas interrompre la lecture de l'entrée standard avec [ENTER] : << EOF |
``` bash | ``` bash | ||
- | cat < bar | + | cat << EOF |
+ | foo | ||
+ | bar | ||
+ | baz | ||
+ | EOF | ||
``` | ``` | ||
- | ### Rediriger les sorties | + | ### Ecrire sur la sortie d' |
+ | ``` bash | ||
+ | echo "sur la sortie standard" | ||
+ | >&2 echo "sur la sortie d' | ||
+ | ``` | ||
+ | |||
+ | ### Rediriger les sorties | ||
``` bash | ``` bash | ||
echo " | echo " | ||
Ligne 119: | Ligne 236: | ||
``` | ``` | ||
- | ### Pipeline | + | ### Pipeline |
+ | " | ||
``` bash | ``` bash | ||
cat bar | grep " | cat bar | grep " | ||
``` | ``` | ||
- | ## Logique : ; && || | + | </ |
+ | {{ :: | ||
+ | < | ||
+ | |||
+ | ## Logique : ; && || ! | ||
``` bash | ``` bash | ||
echo " | echo " | ||
Ligne 130: | Ligne 253: | ||
echo " | echo " | ||
false ; echo " | false ; echo " | ||
+ | ! false ; echo " | ||
true || echo " | true || echo " | ||
false || echo " | false || echo " | ||
Ligne 136: | Ligne 260: | ||
``` | ``` | ||
- | ## Variables | + | ## Interpretation des variables |
``` bash | ``` bash | ||
- | echo $USER | ||
echo $PATH | echo $PATH | ||
echo $HOME | echo $HOME | ||
+ | echo $USER | ||
+ | echo " | ||
+ | echo ' | ||
+ | echo '" | ||
+ | echo "' | ||
+ | echo " | ||
+ | echo " | ||
+ | echo ${USER^^} | ||
+ | TOUT_EN_MAJ=" | ||
export | export | ||
echo $PS1 | echo $PS1 | ||
echo $? | echo $? | ||
echo $! | echo $! | ||
+ | ``` | ||
+ | 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 | ||
+ | ``` | ||
- | ## Scripts | + | ## Un peu de recul : execution des commandes |
+ | On peut exécuter les commandes intégrés au shell ou les programmes executables. | ||
+ | ``` bash | ||
+ | which cd ; echo $? | ||
+ | which pwd ; echo $? | ||
+ | ls -l / | ||
+ | ``` | ||
- | ### Fil rouge : un script pour trier ses photos | + | Pour exécuter |
- | - variables | + | ``` bash |
- | - conditions | + | /usr/bin/ls |
- | - fonctions | + | ls |
- | - boucles | + | echo $PATH |
- | - return code (exit) | + | PATH="/ |
+ | ls | ||
+ | which ls | ||
+ | / | ||
+ | cd /usr/bin | ||
+ | ls | ||
+ | ./ls | ||
+ | |||
+ | ``` | ||
+ | |||
+ | ## Scripts : philosophie tests loops fonctions arguments | ||
### Philosophie UNIX | ### Philosophie UNIX | ||
Ligne 161: | 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.1699059616.txt.gz · Dernière modification : 2023/11/04 01:00 de bigMax