Génie de la production automatisée GPA435 S.E. et prog. système Cours #6 Programmation bash (II) Jean-Phillipe Roberge, ing., M. ing. T. Wong, ing., Ph.D. P. Ouimet, ing. Jr. 1
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes Cours #6 Programmation bash (II) Motivation Tout comme l’apprentissage d’une langue étrangère, la programmation bash passe par la reconnaissance de l’apport des instructions disponibles. Leur particularité et idiosyncrasie seront dévoilées par la pratique et par des applications. Objectifs d’apprentissage Reconnaître une fonction utilisateur; Appliquer la neutralisation des méta-caractères Rendre un programme plus robuste par exec et trap. Those who don't understand Linux are doomed to reinvent it, poorly. - Anonyme Those who don't understand Linux are doomed to reinvent it, poorly. - Anonyme 2 Objectifs Cogito Neutralisation Exec et trap Exercices Lecture Fonctions
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes Programmation bash (II) 1. Comment peut-on … Objectifs Cogito Comment lire chacun des mots contenus dans un fichier? Pourquoi voulez-vous faire cela? Peu importe, voici une façon: 3 Contenu du fichier MaVie.txt La boucle qui affiche les mots du fichier MaVie.txt La variable LIGNE contient tour à tour les mots du fichier MaVie.txt. Techniquement, cette boucle for – do – done affiche à la sortie standard des caractères séparés par un ou des espaces. Le caractère espace est un séparateur de champ contenu dans la variable système IFS (Internal Field Separator). Neutralisation Exec et trap Exercices Lecture Fonctions
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes Programmation bash (I) 1. Comment peut-on … Objectifs Cogito OK. Comment lire des lignes d’un fichier alors? Ah! C’est beaucoup mieux… 4 Dans cette boucle, on redirige l’entrée standard de la commande read à un fichier nommé MaVie.txt. Observer l’emplacement de l’opérateur de redirection ( < ). Il est placé à l’extérieur de la boucle while – do – done. Qu’arrive-t-il si la boucle est écrite: While read LIGNE < MaVie.txt; do echo "$LIGNE" ; done Neutralisation Exec et trap Exercices Lecture Fonctions
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 2. Fonctions utilisateurs Objectifs À l’instar de bien des langages de programmation, nous pouvons rendre la programmation plus structurées en utilisant des fonctions; La syntaxe d’une fonction utilisateur est: nom_fonction () { commandes } ou encore nom_fonction () { commandes } Une fonction utilisateur jour le rôle d’une sous-routine. 5 Cogito Fonctions Programmation bash (II) Neutralisation Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 2. Fonctions utilisateurs Objectifs Caractéristiques des fonctions utilisateurs: Définir les fonctions utilisateurs au début du fichier de commandes; Prend préséance sur les commandes systèmes portant le même nom – Attention! Source de confusion! Doit avoir un statut de retour: exit n où n est un entier positif (0 Ok, >0 erreur). Par défaut une fonction utilisateur retourne la valeur 0 comme statut de retour; nom_fonction () { commandes # La valeur est un code d’erreur… exit 3 } 6 Cogito Fonctions Programmation bash (II) Neutralisation Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 2. Fonctions utilisateurs Objectifs Passage des paramètres à une fonction Par variables globales#!/bin/bashERRNO=1234 gestion_erreur () { case "$ERRNO" in case "$ERRNO" in 0) ;; # pas d'erreur 0) ;; # pas d'erreur 101) echo "Répertoire inexistant" ;; 101) echo "Répertoire inexistant" ;; 102) echo "Permission d'écriture obligatoire";; 102) echo "Permission d'écriture obligatoire";; *) echo "Code d'erreur inconnu" *) echo "Code d'erreur inconnu" exit 1 exit 1 ;; ;; esac esac} while [ $ERRNO -ne 0 ] do repertoire; ERRNO=$? repertoire; ERRNO=$? gestion_erreur gestion_erreurdone 7 Cogito Fonctions Programmation bash (II) 2) La fonction gestion_erreur() peut traiter le contenu de la variable globale ERRNO. 1) Le contenu de la variable globale ERRNO est visible par la fonction gestion_erreur() puisqu’elle a été déclarée avant l’appel de la fonction. Neutralisation Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 2. Fonctions utilisateurs Objectifs Passage des paramètres à une fonction Par paramètres de position#!/bin/bash gestion_erreur () { case "$1" in case "$1" in 0) ;; # pas d'erreur 0) ;; # pas d'erreur 101) echo "Répertoire inexistant" ;; 101) echo "Répertoire inexistant" ;; 102) echo "Permission d'écriture obligatoire";; 102) echo "Permission d'écriture obligatoire";; *) echo "Code d'erreur inconnu" *) echo "Code d'erreur inconnu" exit 1 exit 1 ;; ;; esac esac}ERRNO= while [ $ERRNO -ne 0 ] do repertoire; ERRNO=$? repertoire; ERRNO=$? gestion_erreur "$ERRNO" gestion_erreur "$ERRNO"done 8 Cogito Fonctions Programmation bash (II) 2) La fonction gestion_erreur() reçoit le contenu de la variable ERRNO dans sa variable de position $1. 1) Le contenu de la variable globale ERRNO est passé à la fonction gestion_erreur() comme un paramètre de position. Neutralisation Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 2. Fonctions utilisateurs Objectifs Passage des paramètres à une fonction Par paramètres de position # définition de la fonction funcA () { # $# le nombre de paramètres de position # $* et la ligne des paramètres de position # $1 reçoit le contenu de $par1 # $2 reçoit le contenu de $par2 # $3 reçoit le contenu de $par3 # et ainsi de suite } # utilisation de la fonction funcA par1 par2 par3 9 Cogito Fonctions Programmation bash (II) Donc, pour une fonction utilisateur, les paramètres de position se comportent exactement comme ceux d’un programme. Neutralisation Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 3. Neutralisation des caractères – première visite Objectifs Certains caractères ont une signification spéciale pour l’interpréteur de commandes Par exemple, &, (, ), {, }, *, !, |, \, $, etc. Cependant, à cause du nombre limité de caractères disponibles, certaines commandes et programmes réutilisent ces mêmes caractères mais à d’autres fins Par exemple: $ pour signifier la valeur monétaires; () pour regrouper des expressions mathématiques et/ou logiques; * pour représenter l’opérateur de multiplication; " pour représenter l’unité impériale de mesure; >, < pour représenter les opérateurs relationnelles; Etc. 10 Cogito Neutralisation Fonctions Programmation bash (II) Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmesObjectifs Sans un mécanisme de contournement, ces caractères spéciaux seront interprétés d’une façon erronée par l’interpréteur de commande Les commandes et programmes (sans compter les utilisateurs) qui ont besoin de ces caractères spéciaux ne pourront pas s’exécuter correctement. D’où la nécessiter de neutraliser la signification particulière de ces caractères spéciaux pour l’interpréteur de commandes. 11 Cogito Neutralisation Fonctions Programmation bash (II) Wow! 5 * 3 = 15 donne tout ça? 3. Neutralisation des caractères – première visite Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmesObjectifs Un exemple Nous désirons afficher la chaîne de caractères « Lola & Lilo » à la sortie standard. Voici le résultat L’interpréteur de commandes a interprété ceci: 1.Exécuter echo Lola & ( echo Lola en arrière-plan); 2.Exécuter Lilo comme une commande. 12 Cogito Neutralisation Fonctions Programmation bash (II) 3. Neutralisation des caractères – première visite Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmesObjectifs Un exemple Nous désirons afficher la chaîne de caractères « Lola & Lilo » à la sortie standard. Voici le résultat: Le méta-caractère & est neutralisé par le symbole \ qui agit comme un neutralisateur; L’interpréteur de commande considérera \& comme le simple caractère esperluette ( & ) et non comme le symbole pour exécuter en arrière-plan d’une commande. 13 Cogito Neutralisation Programmation bash (II) Les neutralisateurs 3. Neutralisation des caractères – première visite Fonctions Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmesObjectifs Ainsi, le symbole \ permet la neutralisation du caractère qui le suit. Le symbole \ a effectivement neutralisé le premier méta-caractère esperluette ( & ) mais pas le second; On dit que \ est un neutralisateur de simple (1 seul) caractère. 14 Cogito Neutralisation Programmation bash (II) 3. Neutralisation des caractères – première visite Fonctions Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmesObjectifs Nous pouvons neutraliser plus d’un caractère à la fois par l’utilisation des guillemets et des apostrophes Guillemets o Neutralise la signification spéciale du caractère ESPACE; o Permet la substitution des variables et des commandes; o Permet l’utilisation du neutralisateur \. 15 Cogito Neutralisation Programmation bash (II) Bug 2: $CAD est interprété comme le contenu de la variable CAD et non pas dollar canadien Bug 1: Le caractère ESPACE joue le rôle de séparateur. Seulement 25 est assigné à la variable PRIX. L’utilisation des guillemets et de \ permet de solutionner ce problème. 3. Neutralisation des caractères – première visite Fonctions Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmesObjectifs Nous pouvons neutraliser plus d’un caractère à la fois par l’utilisation des guillemets et des apostrophes Apostrophes o Neutralise la signification spéciale du caractère ESPACE; o Empêche la substitution des variables et des commandes; o Neutralise du neutralisateur \. 16 Cogito Neutralisation Programmation bash (II) Les apostrophes ont effectivement neutralisé le neutralisateur \ et ont empêché la substitution de la variable CAD. ‘ ‘ 3. Neutralisation des caractères – première visite Fonctions Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmesObjectifs D’autres exemples qui aident à la compréhension de la neutralisation des méta-caractères 17 Cogito Neutralisation Programmation bash (II) gpa435> MACHINE=`hostname` gpa435 > echo La machine \'$MACHINE\' est en panne La machine 'my-ubuntu' est en panne gpa435 > echo La machine "'$MACHINE'" est en panne La machine 'my-ubuntu' est en panne gpa435 > echo La machine '$MACHINE' est en panne La machine $MACHINE est en panne gpa435 > echo "La machine '$MACHINE' est en panne" La machine 'my-ubuntu' est en panne gpa435 > echo 'La machine $MACHINE est en panne' La machine $MACHINE est en panne gpa435 > echo 'La machine '$MACHINE' est en panne' La machine my-ubuntu est en panne 3. Neutralisation des caractères – première visite Fonctions Exec et trap Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 4. exec et trap Objectifs Ce deux commandes sont des commandes internes de bash; Dans un programme, la commande exec permet l’exécution d’une commande sans la création d’un nouveau processus; De même, il n’y a pas de création d’un interpréteur enfant pour l’exécution de la commande; Attention! Ce n’est pas un appel de sous-routine car le contrôle ne revient pas au programme. 18 Cogito Neutralisation Programmation bash (II) Exec et trap La ligne exec date exécute la commande date et lui passe le contrôle. Résultat: On voit que la ligne echo "Fin du programme" n’est jamais exécutée. Fonctions Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 4. exec et trap Objectifs La commande exec sert aussi à rediriger les entrées-sorties standard d’une façon globale; Différentes syntaxes: exec no_desc> nom_fich exec no_desc>&no_desc exec no_desc>> nom_fich exec no_desc< nom_fich exec no_desc<&no_desc 19 Cogito Neutralisation Programmation bash (II) Exec et trap Légende: no_desc : numéro de descripteur nom_fich : nom d’un fichier >, >&, >>, <, <& : opérateurs de redirection Sans doute la fonction la plus utile de la commande exec. La redirection réalisée par exec prend l’effet après son exécution et ce, jusqu’à la fin du fichier des commandes. Fonctions Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 4. exec et trap Objectifs Un exemple: 20 Cogito Neutralisation Programmation bash (II) Exec et trap À partir de ce point, tous les messages d’erreur seront envoyés dans un fichier nommé errmsg.txt. On pourra en faire de même pour rediriger d’une façon globale la sortie standard et l’entrée standard en utilisant les opérateurs de redirection appropriés. Fonctions Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 4. exec et trap Objectifs La commande trap est fort utile pour la programmation; La syntaxe; trap ‘commandes’ signaux Où commandes est un ensemble de commandes bash et signaux sont des numéros (entiers). À la réception d’un signal par le programme, les commandes entre apostrophes sont automatiquement exécutées par bash. L’utilité de la commande trap Pour réaliser une fin de programme en « beauté » (graceful exit) o Advenant d’une erreur fatale, le programme pourra effacer ses fichiers temporaires, arrêter ses processus fils, afficher un message d’urgence, etc. Capter les signaux en provenance de l’utilisateur o Certaines combinaisons de touches envoient de signaux logiciels qui peuvent être captés par trap. 21 Cogito Neutralisation Programmation bash (II) Exec et trap On dit que l’utilisation de trap permet d’augmenter la robustesse d’un programme. Fonctions Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 4. exec et trap Objectifs Signaux disponibles d’un système Linux/UNIX 22 Cogito Neutralisation Programmation bash (II) Exec et trap Ces signaux sont conforme aux standards POSIX. Par contre, la valeur numérique des signaux peut varier d’une architecture matérielle à l’autre. Les signaux SIGRTMIN et SIGRTMAX sont réservés pour des signaux de type temps-réel. Voir le document PDF « signals.pdf », disponible sur site moodle du cours, pour connaître la signification de ces signaux. Fonctions Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 4. exec et trap Objectifs Voici quelques signaux les plus communs 23 Cogito Neutralisation Programmation bash (II) Exec et trap Signal (no) Signification SIGHUP (1)Lien logique avec le terminal coupé. SIGINT (2)Signal d’interruption via clavier (ctrl-c). SIGTERM (15)Terminaison si possible du processus ( kill ). SIGKILL (9)Terminaison immédiate du processus ( kill -9 ). SIGSTOP (19)Suspension du programme (voir SIGCONT). SIGCONT (18)Continuation du programme (voir SIGSTOP). SIGTSTP (20)Signal de suspension via clavier (ctrl-z) SIGUSR1 (10)Signal défini par l’utilisateur (programmeur). SIGUSR2 (12)Signal défini par l’utilisateur (programmeur). Attention! Dans cette liste Les signaux 9, et 19 ne peuvent être interceptés par trap, Saviez-vous pourquoi? Fonctions Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 4. exec et trap Objectifs Voici un exemple de « graceful exit » 24 Cogito Neutralisation Programmation bash (II) Exec et trap Intercepter le signal SIGINT, touches ctrl-c par l’utilisateur. Programme principal. Pour les besoins de cet exemple, ce programme ne fait qu’augmenter le compte de la variable à toutes les secondes. Programme en exécution puis l’utilisateur appuie sur les touches ctrl-c. La commande trap intercepte le signal et affiche à la sortie standard un message. Fonctions Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 4. exec et trap Objectifs Voici un exemple de « graceful exit » 25 Cogito Neutralisation Programmation bash (II) Exec et trap Intercepter le signal SIGINT, touches ctrl-c par l’utilisateur. Traitement du signal SIGINT par une fonction utilisateur. Le reste du programme est identique à l’exemple précédent. Fonctions Exercices Lecture
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 4. exec et trap Objectifs Voici un exemple où un processus parent crée et exécute 2 processus enfant en arrière-plan. À la réception du signal SIGINT par le processus parent, ce dernier provoque la fin d’exécution de ses deux enfants. 26 Cogito Neutralisation Programmation bash (II) Exec et trap Exercices Lecture Ici le parent crée 2 processus enfants et s’exécutent en arrière- plan. La variable pid contient les numéro d’identification des processus. À la réception du signal SIGINT (ctrl-c), le processus parent termine les enfants par la commande kill. Fonctions
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 9. Exercices 1.Qu’aura comme effet le code suivant: rm –r travail mkdir travail for ((i =1; i <=3; i++)) do echo " `expr $i \* 4`" >>./travail/Fichier$i done echo “FIN" >>./travail/Fichier* chmod 644./travail/Fichier* 2.Donner le contenu des fichiers créés dans 1. Objectifs 27 Programmation bash (II) Cogito Neutralisation Exec et trap Exercices Lecture Fonctions
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 9. Exercices 3.Qu’aura comme effet le code suivant: #!/bin/bash rm FichierSortie FichierErreur 2>/dev/null exec 5>FichierSortie exec 6>FichierErreur exec 3>&5 exec 4>&6 if [ $# -ne 0 ]; then exec 2>&4 echo "Erreur! Ce script ne prend pas de paramètres..." >&2 exit 1 fi echo "Bravo! Vous avez utilisé le programme convenablement..." >&3 exit 0 Objectifs 28 Programmation bash (II) Cogito Neutralisation Exec et trap Exercices Lecture Fonctions
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes 9. Exercices 4.Quel est le résultat de ces lignes de commandes? ETS_Web=" Web_mon_Ecole="ETS_Web" ping ${!Web_mon_Ecole} 5.Quels sont les résultats de des lignes de commandes? w=date echo –e "Le resultat est:\n $(w)" echo –e "Le resultat est:\n $($w)" Pourquoi? Objectifs 29 Programmation bash (II) Cogito Neutralisation Exec et trap Exercices Lecture Fonctions
Cours #6 GPA435 Systèmes d'exploitation et programmation de systèmes Fin du cours #6 Notes de cours GPA435, chapitre 5 et 6. Chapitre 8: Mikkey, M. G BASH Programming − Introduction HOW−TO. Disponible: HOWTO.pdf HOWTO.pdf Robbins, D Bash by example, Part 1. Disponible Chapitre 3: Garrels, M Bash Guide for Beginners. Disponible Shell Parameter Expansion. GNU. En ligne >. Consulté le 31 juillet Expansion.html Command substitution. GNU. En ligne >. Consulté le 31 juillet hackers.org/syntax/expansion/cmdsubst 30 Objectifs Programmation bash (II) Cogito Neutralisation Exec et trap Exercices Lecture Fonctions