diff --git a/src/shell/scripts.md b/src/shell/scripts.md index cb3dc46..07a0d46 100644 --- a/src/shell/scripts.md +++ b/src/shell/scripts.md @@ -9,12 +9,16 @@ non comme si on lançait un autre shell, c'est important par exemple pour les définitions de variables), - soit en rendant le fichier exécutable (`chmod u+x nom_fichier_shell`), puis en - tapant le nom du fichier. - Cela fonctionne uniquement quand le répertoire courant, `.`, est dans `$PATH`, - sinon il faut dire au shell que c'est le fichier qui est dans le répertoire - courant qu'on veut exécuter : `./nom_fichier_shell`. + tapant le chemin du fichier. Quand il est dans le répertoire courant, on le + lance en tapant : `./nom_fichier_shell`. -Pour être sûr du shell qui est en train de s'exécuter dans un fichier de script shell, il est plus prudent d'ajouter son nom en début de fichier la ligne (par exemple, ici sh) : +> ⚠️ Une ancienne pratique consistait à mettre le répertoire courant `.` dans la +> variable `PATH`. C'est une pratique abandonnée, car posant des problèmes de +> sécurité. + +Pour être sûr du shell qui est en train de s'exécuter dans un fichier de script +shell, il est plus prudent d'ajouter son nom en début de fichier la ligne (par +exemple, ici sh) : ```bash #!/bin/sh @@ -25,12 +29,32 @@ pour exécuter le fichier. Ce *shebang*, qui est un en-tête, doit se mettre sur la première ligne. -Une seconde ligne peut être intéressante car elle peut influer sur l'ordre de -tri avec `sort` par exemple. -Pour garantir un ordre de tri lexicographique, on peut positionner la variable -d'environnement suivante comme suit `export LC_COLLATE=C`. +> ⚠️ Il faut être conscient les variables d'environnement peuvent avoir une +> influence sur le comportement de certaines commandes (comme `grep` ou `sort`). +> Par exemple la variable `LANG` de bash qui, pour un utilisateur français peut +> valoir `fr_FR.UTF-8`, influence l'encodage que les programmes s'attendent à +> avoir en entrée, l'encodage qu'ils utilisent pour la sortie, et peut-être +> aussi l'ordre de tri des caractères... + +Pour être certain que le chemin de l'interpréteur va être trouvé, il vaut mieux +utiliser la variante: + +```bash +#!/usr/bin/env bash +``` + +Ici, nous utilisons la commande `/usr/bin/env` qui va trouver dans la variable +`PATH` le premier emplacement où se trouve la commande `bash` et l'utiliser pour +interpréter le fichier courant. + +Deux intérêts: + +1. selon les distributions de Linux, les chemins ne sont pas exactement les mêmes, +2. `bash` est installé par défaut sur Linux, et `sh` est en réalité un alias de + `bash`. ## Référence -- [Programmation shell sous Unix/Linux - ksh, bash, sh (5e édition) | Editions - ENI](https://www.editions-eni.fr/open/mediabook.aspx?idR=71ff518ce4cda68b5004c431607616de) +- [Programmation shell sous Unix/Linux - ksh, bash, norme POSI (7e édition) | Editions + ENI](https://www.editions-eni.fr/livre/programmation-shell-sous-unix-linux-ksh-bash-norme-posix-avec-exercices-corriges-7e-edition-9782409038020) +- [Shell Scripting Tutorial](https://www.shellscript.sh/)