Chapitre 7: Scripts shell Flashcards
Programme
Ensemble d’instructions destinées à être exécutées par un ordinateur, 2 programmes?
Programmes binaires
Programmes scripts
Programmes binaires
Programmes scripts
Programmes binaires
* Programme en langage machine
* Spécifique à une architecture (famille de processeurs)
* Nécessite souvent un environnement d’exécution spécifique
(bibliothèques, système d’exploitation)
Programmes scripts
* Programme en langage de script
* Sous forme textuelle
* Exécutés par un interpréteur (un autre programme)
Script shell → Programme destiné à être interprété par le shell
Langages de script
Spectre large
Spectre large
* Spécifique à un domaine (DSL)
* Généraliste
* Langage glue / langage d’extension
Rapide à apprendre et à utiliser
* Concis (moins de verbosité)
* Typage dynamique (moins de structures et de contraintes)
Environnement inclus
* Interprétés plutôt que compilés
* L’efficacité n’est pas un objectif
Programmes sous Unix
Un programme = un fichier exécutable
$ file /bin/bash /usr/bin/vimtutor
/bin/bash: ELF 64-bit LSB pie executable
/usr/bin/vimtutor: POSIX shell script
Droits nécessaires
* x pour les programmes binaires
* x et r pour les programmes scripts
Fichiers accessoires
La plupart des programmes ont besoin de fichiers supplémentaires
- Bibliothèques partagées binaires (.so) et/ou script
- Ressources (images, son, configuration, etc.)
- Autre programmes supplémentaires
Un programme échouera si ces fichiers manquent
Les gestionnaires de paquets assurent la disponibilité et la cohérence
ce ces fichiers
Exécuter un programme ⋆
Chemin absolu ou relatif
Avec au moins un slash « / »
* /opt/INF1070/hello
* script/hello
* ./hello → exécute un programme du répertoire courant
Nom simple
Le nom d’un fichier d’un des répertoires d’exécutables
Habituellement au moins /bin, /usr/bin et /usr/local/bin
- type affiche des informations sur le type de commande (POSIX)
- which localise une commande dans l’environnement courant
- whereis recherche une commande à d’autres endroits habituels
- echo “$PATH” pour voir les répertoires d’exécutables (les détails
plus tard)
Script ou binaire ?
* /usr/bin/ts (timestamp) horodate l’entrée standard (extra)
* /usr/bin/chromium navigateur web de Google (extra)
* /usr/bin/ldd lister les bibliothèques partagées nécessaires (extra)
Tester avec file ou ouvrir avec vim
Shebang
Tout fichier texte lisible et exécutable (r-x) peut être exécuté
- Les premiers caractères sont « #! » (shebang)
- Ça indique le chemin absolu de l’interpréteur à utiliser
- Sans shebang, le défaut est souvent /bin/sh
$ cat hello
#!/bin/sh
echo Heeeeeellllloooooo!!!!!!
$ ./hello
Heeeeeellllloooooo!!!!!!
Autres exécution de scripts
Script en ligne
Option sh -c exécute les instructions passées en argument
$ dash -c “echo hello | rev”
Utile pour profiter des fonctionnalités du shell quand une simple
commande est attendue
Sourçage
La commande interne « . » (point) exécute un script dans le
processus courant
$ . ./niceprompt
Utile pour importer des bibliothèques et fichiers de configuration
Pourquoi programmer en shell ?
- Universel: C’est toujours disponible et utilisé un peu partout
- Glue: Ça permet de facilement faire coopérer des programmes
- Efficace: Car la syntaxe est très concise et expressive
- Neutre: Ça fâche tout le monde pareil
Mais
* Ça requiert une connaissance spécialisée
* C’est risqué: le naïf fait facilement des bogues (voir INF600C)
* C’est bizarrement portable (POSIX vs. bash vs. utilitaires)
* Les structures de données et de contrôle sont très pauvres
* C’est lent
Commandements
- Tu feras seulement des petits scripts
- Tu respecteras les bonnes pratiques
- Tu protégeras tous tes développements de chaînes
- Tu chercheras la simplicité et éviteras les commandes superflues
- Tu maintiendras ton code clair et lisible
- Tu éviteras la programmation shell si ce n’est pas adapté
- Tu garderas tes oneliners fragiles pour la ligne de commande
- Tu ne regretteras pas de devenir bon en shell
Exécution de scripts
* Un script shell s’exécute ligne par ligne
Attention à l’échec
Quand une commande échoue le script continue (par défaut)
Séquences de commandes
Le point virgule « ; » enchaîne les commandes