Outils pour utilisateurs

Outils du site


workshop_shell

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
workshop_shell [2023/11/04 10:17] bigMaxworkshop_shell [2024/03/20 12:56] (Version actuelle) bigMax
Ligne 1: Ligne 1:
 <markdown> <markdown>
  
-# Workshop Shell Unix (Interpréteur de commandes)+# Workshop Shell Unix compatible (Interpréteur de commandes)
  
 ## Guidelines pour l'atelier ## Guidelines pour l'atelier
Ligne 28: Ligne 28:
  
 Retourne un "Result Code" (RC) compris entre 0 et 127. Retourne un "Result Code" (RC) compris entre 0 et 127.
-- RC = indique que tout s'est bien déroulé.+- RC = indique que tout s'est bien déroulé.
 - RC > 0 indique qu'une erreur s'est produite. - 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 50: 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'existe pas, update son timestamp de modification)
 +- cp: copy files
 +- mv: move files
 +- rm: remove files
 +- mkdir: make directory
 +
 ``` bash ``` bash
 touch foo touch foo
Ligne 61: 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 84: 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 95: Ligne 115:
 free -h free -h
 mount mount
 +```
 +
 +## Quelques autres commandes basiques
 +- echo: imprime les arguments sur la sortie standard (l'écran)
 +- cat: concatene des fichiers et les imprime sur la sortie standard (l'écran)
 +- read: lit l'entrée standard (le clavier) et stoque le contenu dans une variable
 +- 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'historique des commandes que l'on a entrées.
 +
 +**Avec la combinaison de touch [CTRL]-[R] on peut rechercher dans l'historique et ça ça change la vie.**
 +
 +Avec la variable d'envrionnement **HISTCONTROL=ignoreboth** (en général configurée par défaut) si on ne souhaite pas qu'une commande apparaissent dans l'historique, on peut la préfixer par un **[ESPACE]**.
 +``` bash
 +echo "$HISTCONTROL"
 +HISTCONTROL=ignoreboth
 +echo "message public"
 + echo "message secret"
 +echo "message public 2"
 +history 10
 +```
 +
 +Généralement la commande history à des options pour allez supprimer des entrées dans l'historique.
 +``` bash
 +help history
 +echo "mon secret"
 +history 5
 +history -d -3
 +history 5
 ``` ```
  
Ligne 111: Ligne 167:
  
 ## IO (Entrées Sorties) (redirection / pipelines) : 2>  >  >>  |  <<  < ## IO (Entrées Sorties) (redirection / pipelines) : 2>  >  >>  |  <<  <
-**TODO**: Utiliser des schéma+
 ### Configuration par défaut de STDIN STDOUT et STDERR ### Configuration par défaut de STDIN STDOUT et STDERR
 Tous les programmes : Tous les programmes :
Ligne 121: Ligne 177:
 - STDIN est relié au "clavier" - STDIN est relié au "clavier"
 - STDOUT et STDERR sont reliés à "l'écran" (difficile à distinguer) - STDOUT et STDERR sont reliés à "l'écran" (difficile à distinguer)
 +
 +</markdown>
 +{{ ::shell_program_ios.png?direct&400 |}}
 +<markdown>
  
 ### Suppression des erreurs : 2> /dev/null ### Suppression des erreurs : 2> /dev/null
Ligne 177: Ligne 237:
  
 ### Pipeline (chaîner des programmes) : | ### Pipeline (chaîner des programmes) : |
 +"Pipeliner" 2 programmes permet d'enchainer l'exécution des 2 programmes. La sortie standard (STDOUT) du premier programme (à gauche) sera "streamée" dans l'entrée standard (STDIN) du second programme.
 +
 ``` bash ``` bash
 cat bar | grep "lo" cat bar | grep "lo"
 ``` ```
  
-## Logique : ; && ||+</markdown> 
 +{{ ::piped_programs_ios.jpeg?direct&400 |}} 
 +<markdown> 
 + 
 +## Logique : ; && || !
 ``` bash ``` bash
 echo "un" ; echo "deux" echo "un" ; echo "deux"
Ligne 187: Ligne 253:
 echo "AND_1" && echo "AND_2" echo "AND_1" && echo "AND_2"
 false ; echo "RC=$?" false ; echo "RC=$?"
 +! false ; echo "RC=$?"
 true || echo "second statement" ; echo "RC=$?" true || echo "second statement" ; echo "RC=$?"
 false || echo "second statement" ; echo "RC=$?" false || echo "second statement" ; echo "RC=$?"
Ligne 202: Ligne 269:
 echo '"$USER"' echo '"$USER"'
 echo "'$USER'" echo "'$USER'"
 +echo "$USERfoo
 +echo "${USER}foo
 +echo ${USER^^}
 +TOUT_EN_MAJ="FOOBARBAZ" ; echo "${TOUT_EN_MAJ,,}"
 export export
 echo $PS1 echo $PS1
Ligne 208: 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 232: Ligne 311:
 ``` ```
  
-## Scripts : philosophie tests loops fonctions+## Scripts : philosophie tests loops fonctions arguments
  
-### Fil rouge : un script pour trier ses photos+### Philosophie UNIX 
 +- Écrivez des programmes qui effectuent une seule chose et qui le font bien. 
 +- Écrivez des programmes qui collaborent. 
 +- Écrivez des programmes pour gérer des flux de texte [en pratique des flux d'octets], car c'est une interface universelle. 
 + 
 +### Fil rouge : un script pour trier et compresser ses photos
 - shebang - shebang
 +- fonctions
 +- return code (exit)
 - arguments - arguments
 - variables - variables
 - conditions - conditions
-- fonctions 
 - boucles - boucles
-- return code (exit) 
  
-### Philosophie UNIX +Pour installer les packages nécéssaires sur debian/ubuntu like : 
-Écrivez des programmes qui effectuent une seule chose et qui le font bien+``` bash 
-Écrivez des programmes qui collaborent+sudo apt install imagemagick exiftool 
-Écrivez des programmes pour gérer des flux de texte [en pratique des flux d'octets]car c'est une interface universelle.+``` 
 + 
 +### Initialisation du script : shebang usage() 
 +Nous éditons un nouveau fichier texte que nous allons "transformer" en script
 +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'utilisateuret documenter l'utilisation du script. 
 + 
 +``` bash 
 +vim gere_mes_photos.sh 
 + 
 +#! /bin/bash 
 + 
 +usage() { 
 +        >&2 echo "Message: $1" 
 +        >&2 echo "usage: $0 [PHOTO_1] ... [PHOTO_N]" 
 +        exit 1 
 +
 + 
 +>&2 echo "Lancement de mon outil de gestion des photos ..." 
 + 
 +./gere_mes_photos.sh 
 +chmod u+x gere_mes_photos.sh 
 +./gere_mes_photos.sh 
 +```
  
-### Séparation des arguments+### Tester les arguments en entrée : test
 Un programme prend en paramètre des arguments séparés par des espaces (par défaut). Un programme prend en paramètre des arguments séparés par des espaces (par défaut).
  
 +On vérifie que l'utilisateur nous fournit au moins un argument.
 +On enrobe la variable $1 de double quottes ("") pour éviter les bugs lorsque la variable contient un espace par exemple.
 +``` bash
 +test -n "$1" || usage "No picture supplied as argument !"
 +test -n "$@" || usage "No picture supplied as argument !"
 +
 +./gere_mes_photos.sh
 +
 +./gere_mes_photos.sh foo
 +```
 +
 +### 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 "$@"; do
 +        >&2 echo "Traitement du fichier: '$file' ..."        
 +done
 +```
 +
 +### Utiliser un bloc conditionnel : if then elif else
 +On peut utiliser un bloc conditionnel pour effectuer un traitement.
 +``` bash
 +        if ! [ -f "$file" ]; then
 +                usage "Supplied file: [$file] is not a valid file !"
 +        fi
 +        
 +./gere_mes_photos.sh foo bar
 +```
 +
 +### Executer nos 2 programmes sur chaque fichier
 +- On utilise le programme exiftool pour renommer notre image en utilisant la metadata "date de création" incluse dans notre fichier.
 +- On utilise le programme convert pour resize notre image.
 +
 +``` bash
 +tmpFile="compressed.${file}"
 +>&2 echo "Compression du fichier [$file] > [$tmpFile] ..."
 +convert -resize 50% "$file" "$tmpFile"
 +
 +>&2 echo "Renommage du fichier [$file] ..."
 +exiftool '-Filename<CreateDate' -d '%Y-%m-%d-%H_%M_%S%%-c.%%e' "$tmpFile"
 +rm -- "$tmpFile"
 +```
 +
 +### Script complet
 +``` bash
 +#! /bin/sh
 +
 +usage() {
 +        >&2 echo "$1"
 +        >&2 echo "usage: $0 <PHOTO_1> [PHOTO_2] ... [PHOTO_N]"
 +        exit 1
 +}
 +
 +test -n "$1" || usage "No picture supplied as argument !"
 +
 +for file in "$@"; do
 +        >&2 echo "Processing $file ..."
 +
 +        if ! [ -f "$file" ]; then
 +                usage "Supplied file: [$file] is not a valid file !"
 +        fi
 +
 +        tmpFile="compressed.${file}"
 +        >&2 echo "Compression du fichier [$file] > [$tmpFile] ..."
 +        convert -resize 50% "$file" "$tmpFile"
 +
 +        >&2 echo "Renommage du fichier [$file] ..."
 +        exiftool '-Filename<CreateDate' -d '%Y-%m-%d-%H_%M_%S%%-c.%%e' "$tmpFile"
 +        rm -- "$tmpFile"
 +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 ?
  
 </markdown> </markdown>
workshop_shell.1699093030.txt.gz · Dernière modification : 2023/11/04 10:17 de bigMax