Newer
Older
cours-unix-shell / src / shell / scripts.md

Scripts - Shell -UNIX

Un fichier script contenant des commandes shell (par exemple des initialisations de variables, une automatisation de tâches,...) peut être exécuté :

  • soit par sh nom_fichier_shell,
  • soit par . nom_fichier_shell (la différence avec la manière précédente est que c'est comme si on tapait le contenu du fichier dans le shell courant, et 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 chemin du fichier. Quand il est dans le répertoire courant, on le lance en tapant : ./nom_fichier_shell.

⚠️ 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) :

#!/bin/sh

Cette ligne a la forme d'un commentaire (elle commence par #), on l'appelle un shebang, et signale au shell appelant qu'il faut utiliser le shell /bin/sh pour exécuter le fichier.
Ce shebang, qui est un en-tête, doit se mettre sur la première ligne.

⚠️ 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:

#!/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