Le shell est un programme intégré aux systèmes d'exploitation Linux ou Unix qui interprète les commandes saisies par l'utilisateur. Lorsque vous ouvrez un terminal sur un système Linux, il lance le shell, offrant une interface en ligne de commande (CLI). Les commandes tapées sont exécutées par le shell, et leurs résultats s'affichent à l'écran.
Au-delà de l'exécution interactive, le shell peut aussi lancer des commandes stockées dans un fichier : c'est ce qu'on appelle un script shell. Cet article explore les bases des scripts shell, en se concentrant sur Bash, le shell le plus utilisé aujourd'hui.
Les origines remontent à Unix dans les années 1970, avec le V6 Shell développé par Ken Thompson. Ce shell interactif ne supportait pas encore les scripts.
En 1977 arrive le Bourne Shell (sh), toujours utilisé par défaut pour le compte root. Il introduit les capacités de script, devenues indispensables au fil des ans.
Les années 1980 voient l'émergence de variantes populaires : le C Shell (csh) et le Korn Shell (ksh). Chacun apporte sa syntaxe, parfois très différente de l'original.
Aujourd'hui, le Bash (Bourne-Again SHell) domine. C'est une version améliorée et étendue du Bourne Shell original. Cet article porte sur les scripts Bash.
Pour exécuter un script shell, passez simplement son chemin comme argument au shell :
Exemple de script simple (bonjour.sh) :
echo "Bonjour le monde"
Exécutez-le ainsi :
$ bash bonjour.sh
# Affiche :
Bonjour le monde
Note : Les scripts shell nécessitent des fins de ligne LF (Line Feed). Si vous éditez sous Windows (CR-LF), convertissez-les en LF pour éviter les erreurs sur Linux. Vérifiez les options de votre éditeur.
Pour une exécution directe comme une commande, ajoutez un shebang en première ligne :
#!/bin/bash
Votre script devient :
#!/bin/bash
echo "Bonjour le monde"
Rendez-le exécutable :
$ chmod +x bonjour.sh
Exécutez-le directement :
$ ./bonjour.sh
# Affiche :
Bonjour le monde
Découvrez maintenant les principaux avantages des scripts shell.
L'atout majeur est l'automatisation des tâches récurrentes. Au lieu de répéter manuellement des commandes quotidiennes, stockez-les dans un script. Exemples :
Les scripts simplifient l'enchaînement de commandes complexes. Mémoriser une seule commande est plus aisé que toute une séquence et son ordre précis.
Exemple : le démarrage de Linux exécute des scripts shell dans /etc pour initialiser le système. Sans eux, ces étapes manuelles seraient fastidieuses.
Voici un extrait de /etc/profile, exécuté à chaque connexion :
# /etc/profile : fichier .profile système pour sh(1)
# et shells compatibles (bash(1), ksh(1), ash(1), ...).
if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# Le fichier /etc/bash.bashrc définit déjà PS1 par défaut.
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
# Le umask par défaut est géré par pam_umask.
# Voir pam_umask(8) et /etc/login.defs.
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
Les mêmes tâches sont possibles en C/C++, mais les scripts shell sont bien plus rapides à écrire et déboguer, surtout pour l'administration système : exécution de commandes externes, gestion de fichiers, redirections...
Les langages compilés excellent pour les opérations basses niveaux (appels système, structures de données).
Étant du texte brut, un script shell est inspectable : vérifiez ses actions (suppression de fichiers ?). Copiez-les si besoin.
Le diagnostic est aisé : consultez le code source pour identifier les causes d'erreur (dossier manquant ?). Un bon script vérifie et crée les ressources nécessaires.
Les scripts shell s'exécutent sur tout système Unix-like doté du shell correspondant, indépendamment de l'architecture (x86, MIPS, Sparc...).
Pour un binaire C/C++, il faut recompiler le source, avec risques d'incompatibilités.
Vous connaissez maintenant les scripts shell et leurs atouts. Prêts à automatiser vos tâches ? Partagez vos expériences ou questions en commentaires !
[]