Considérons un script Shell très simple:

# script.sh

echo "Running script $0 with $SHELL"

Lors de son exécution en lançant ./script.sh, j'obtiens:

Running script ./script.sh with /bin/bash

Le script a été lançé avec l'interpréteur bash puisqu'il s'agit du Shell défini pour mon utilisateur.

Si maintenant, j'ajoute la ligne suivante au tout début de mon script:

#!/bin/ksh

J'obtiens à l'éxécution le message suivant:

bash: ./script.sh : /bin/ksh : mauvais interpréteur: Aucun fichier ou dossier de ce type

Pourquoi ? J'ai demandé au Shell bash, qui est mon Shell courant, de lancer le script avec le Korn Shell (/bin/ksh) qui n'est pas installé sur ma machine, et j'ai donc un message d'erreur.

Cette première ligne ajoutée s'appelle un "Shebang" et permet donc de changer d'interpréteur de commande localement dans un script. Le Shebang se compose donc des caractères "dièse" puis "point d'exclamation" suivis du chemin d'accès à l'interpréteur de commandes.

Notez que ce chemin doit être complet, ce qui est peut être gênant si nos scripts Shell doivent fonctionner sur des machines avec des Shells installés ailleurs que dans /bin. Même si c'est rare, cela peut arriver.

Maintenant, laissons tomber ksh puisqu'il n'est pas installé et considérons que notre script doit être exécuté avec bash.

Il y a un moyen de s'affranchir de ce chemin complet de l'interpréteur: il faut utiliser la commande env qui va utiliser la variable d'environnement PATH pour trouver le chemin de bash. On change donc le script comme suit:

#!/usr/bin/env bash
# script.sh

echo "Running script $0 with $SHELL"

L'interpréteur est bien trouvé parce que par défaut, le chemin /bin se trouve dans le PATH.