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/03 17:14] – 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 | ||
- | ## Fichiers | + | ``` bash |
+ | pwd | ||
+ | cd /tmp | ||
+ | pwd | ||
+ | cd | ||
+ | pwd | ||
+ | cd - | ||
+ | pwd | ||
+ | cd | ||
+ | cd ~ | ||
+ | pwd | ||
+ | ls | ||
+ | ls -a | ||
+ | ``` | ||
+ | |||
+ | ## 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 | ||
- | ## Commandes : help ; man | + | ``` bash |
+ | touch foo | ||
+ | cp foo bar | ||
+ | mv bar baz | ||
+ | rm foo | ||
+ | mkdir pif | ||
+ | mkdir -p paf/pouf | ||
- | ## IO (Entrées Sorties) : redirection / pipelines | + | ``` |
- | TODO: Utiliser des chema | + | |
- | ## Expansion | + | ## Permissions des fichiers |
- | TODO : Attention les expansions dependent beaucoup du shell (sh, bash, zsh, ...) | + | - chmod: change file mode |
+ | - chown: change file owner | ||
+ | ``` bash | ||
+ | ls -l foo | ||
+ | chmod u-r foo | ||
+ | ls -l foo | ||
+ | sudo chown root:root foo | ||
+ | ls -l | ||
+ | ``` | ||
- | ## Permissions : ls -l ; chmod ; chown | + | ## Obtenir de l'aide : man ; help |
+ | La commande man permet d' | ||
- | ## Variables | + | ``` bash |
+ | 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 | ||
+ | id | ||
+ | last | ||
+ | ps u | ||
+ | ps aux | ||
+ | uptime | ||
+ | top | ||
+ | du -h | ||
+ | df -h | ||
+ | free -h | ||
+ | mount | ||
+ | ``` | ||
- | ## Scripts : philosophie tests loops fonctions | + | ## 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 | ||
+ | ``` | ||
+ | |||
+ | ## Expansion : * ? ~ {1..5} {Z..A} | ||
+ | Attention les expansions dependent beaucoup du shell (sh, bash, zsh, ...) | ||
+ | L' | ||
+ | |||
+ | ``` bash | ||
+ | rm -rf work1 ; mkdir work1 ; cd work1 | ||
+ | touch foo bar baz | ||
+ | ls f* | ||
+ | ls b* | ||
+ | ls b?z | ||
+ | echo {A..C} | ||
+ | ``` | ||
+ | |||
+ | ## IO (Entrées Sorties) (redirection / pipelines) : 2> > >> | ||
+ | |||
+ | ### 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 des erreurs : 2> /dev/null | ||
+ | ``` bash | ||
+ | rm bar ; echo $? | ||
+ | rm bar 2> /dev/null ; echo $? | ||
+ | ``` | ||
+ | |||
+ | ### Ecriture dans fichier : > | ||
+ | ``` bash | ||
+ | rm -rf work2 ; mkdir work2 ; cd work2 | ||
+ | echo "Hello World" > foo | ||
+ | cat foo | ||
+ | > foo | ||
+ | cat foo | ||
+ | ``` | ||
+ | |||
+ | ### Ecrire à la fin d'un fichier : >> | ||
+ | ``` bash | ||
+ | > bar | ||
+ | echo hello > bar | ||
+ | cat bar | ||
+ | echo world >> bar | ||
+ | cat bar | ||
+ | ``` | ||
+ | |||
+ | ### Lire un fichier sur l' entrée standard : < | ||
+ | Lecture de l' | ||
+ | ``` bash | ||
+ | read txt ; echo " | ||
+ | echo "Hello world !" > foo | ||
+ | read txt < foo ; echo " | ||
+ | ``` | ||
+ | |||
+ | ### Ne pas interrompre la lecture de l' | ||
+ | ``` bash | ||
+ | cat << EOF | ||
+ | foo | ||
+ | bar | ||
+ | baz | ||
+ | EOF | ||
+ | ``` | ||
+ | |||
+ | ### Ecrire sur la sortie d' | ||
+ | ``` bash | ||
+ | echo "sur la sortie standard" | ||
+ | >&2 echo "sur la sortie d' | ||
+ | ``` | ||
+ | |||
+ | ### Rediriger les sorties : > 2> 2>& | ||
+ | ``` bash | ||
+ | echo " | ||
+ | >&2 echo " | ||
+ | >&2 echo " | ||
+ | ``` | ||
+ | |||
+ | ### Pipeline (chaîner des programmes) : | | ||
+ | " | ||
+ | |||
+ | ``` bash | ||
+ | cat bar | grep " | ||
+ | ``` | ||
+ | |||
+ | </ | ||
+ | {{ :: | ||
+ | < | ||
+ | |||
+ | ## Logique : ; && || ! | ||
+ | ``` bash | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | false ; echo " | ||
+ | ! false ; echo " | ||
+ | true || echo " | ||
+ | false || echo " | ||
+ | true && echo " | ||
+ | false && echo " | ||
+ | ``` | ||
+ | |||
+ | ## Interpretation des variables : $USER $PATH $PS1 $? | ||
+ | ``` bash | ||
+ | echo $PATH | ||
+ | echo $HOME | ||
+ | echo $USER | ||
+ | echo " | ||
+ | echo ' | ||
+ | echo '" | ||
+ | echo "' | ||
+ | echo " | ||
+ | echo " | ||
+ | echo ${USER^^} | ||
+ | TOUT_EN_MAJ=" | ||
+ | export | ||
+ | echo $PS1 | ||
+ | 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 | ||
+ | ``` | ||
+ | |||
+ | ## 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 / | ||
+ | ``` | ||
+ | |||
+ | Pour exécuter un programme il faut qu'il soit exécutable puis il faut tapper son nom dans l' | ||
+ | ``` bash | ||
+ | / | ||
+ | ls | ||
+ | echo $PATH | ||
+ | PATH="/ | ||
+ | ls | ||
+ | which ls | ||
+ | / | ||
+ | cd /usr/bin | ||
+ | ls | ||
+ | ./ls | ||
+ | |||
+ | ``` | ||
+ | |||
+ | ## Scripts : philosophie tests loops fonctions | ||
### Philosophie UNIX | ### Philosophie UNIX | ||
Ligne 37: | 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.1699031649.txt.gz · Dernière modification : 2023/11/03 17:14 de bigMax