Programmation en shell (bash)

Il existe de nombreux shells: sh, zsh, ksh, bash, csh, tcsh, etc. Leur syntaxe varie beaucoup. Les corrections de ce TP seront données pour le shell bash uniquement. Il est assez répandu (c'est le shell par défaut de GNU/Linux et MacOS, entre autres). Vous pouvez, bien sûr, faire le TP avec n'importe quel shell.

Aide

Vous aurez probablement besoin des commandes Unix suivantes:

Vous pouvez également vous reporter à la documentation de bash, à bash(1) et au cours.

On rappelle enfin qu'un script shell est un fichier texte toto.sh qui commence par une ligne précisant le nom de l'interpréteur, par exemple:

#!/bin/bash

(ou tout autre shell de votre choix) et qui est rendu exécutable par la commande chmod +x toto.sh. Il suffit alors de taper ./toto.sh pour l'exécuter.

Exercices

I - Création d'albums photos

Le but du problème est d'écrire un générateur automatique d'albums photos. Étant donné un répertoire contenant des photos, le script doit générer une page web avec des liens vers les images. Voici tout de suite un un exemple.

1) Pour commencer, on demande un script qui créé un fichier index.html contenant, au format HTML, une simple liste de noms des fichiers images du répertoire courant. En cliquant sur un nom de fichier, on est redirigé vers la photo. Pour vous aider, voici un squelette de fichier index.html:

<html>
<head> <title>Mes Photos</title> </head>
<body>
<h1>Coucou</h1>
<ul>
<li><a href="photo.jpg">photo</a>
<li><a href="autre_photo.png">autre photo</a>
</ul>
</body>
</html>

Entrainez-vous sur le répertoire tp_photos (à télécharger et décompresser sur votre compte).

N'oubliez pas, à la fin du TP, d'effacer tous les (gros) fichiers de travail devenus inutiles.

solution) version naïve album1.sh et plus robuste album1alt.sh.

2) Proposez maintenant un script qui génère une page contenant des vignettes cliquables. Vous pourrez vous inspirer du code source de l'exemple. Le script devra générer automatiquement les vignettes, de taille au plus 120 pixels par 120.

solution) album2.sh.

3) Enrichissez votre script pour qu'il lise les arguments passés en ligne de commande. Le premier argument sera, par exemple, le titre de la page à générer (tag HTML <title>). Ajoutez ensuite le traitement des arguments optionnels. Par exemple, l'option --auteur Moi ajoutera l'information <meta name="author" content="Moi"> dans l'en-tête de la page. Modifiez enfin votre script pour utiliser, si elles existent des variables d'environnement telles que TITRE ou AUTEUR. Si une option est précisée en ligne de commande, elle aura préséance sur la variable correspondante.

solution) album3.sh.

4) Testez la robustesse de votre script sur une copie locale du répertoire tp_photos2. Celui-ci contient des fichiers à piège: blancs ou caractères spéciaux dans les noms de fichiers, extensions variables, images invalides, etc. Vérifiez aussi que vos scripts se comportent correctement quand les arguments en ligne de commande ont des caractères spéciaux (blanc, ", etc).

solution) il faut utiliser test -f (vérifie qu'on a à faire à un fichier normal), identify (vérifie qu'il s'agit d'une image), sed -e 's/&/\\&amp;/g/'... (transforme les caractères HTML spéciaux). Tout ceci est fait dans album1alt.sh.

5) On souhaite mettre à jour la page WEB après avoir modifié ou ajouté des images dans le répertoire. Assurez-vous d'abord que relancer le script dans un répertoire contenant déjà un fichier index.html et des vignettes ne pose pas de problèmes. Modifiez ensuite votre programme pour que les image modifiées ou ajoutées le plus récemment apparaissent en fin de la page. Enfin, optimisez votre script pour qu'il ne génère pas la vignette d'une image qui n'a pas changé (on se basera sur la date de dernière modification).

solution) album5.sh.

6) Étendez votre script pour qu'il gère une variété de types de fichiers (sons, vidéos, documents PostScript et PDF, etc.) Le type d'un fichier peut se deviner par son extension ou par la commande magique file(1). Selon le type du fichier, la vignette aura un aspect différent. Par exemple, un image prise au milieu d'une vidéo (voir mplayer(1)), la première page d'un document texte (voir gs(1)), une icône fixe pour un fichier son, etc.

solution) album6.sh.

II - Recherche de symboles dans les bibliothèques

Vous avez un source C qui compile bien mais ne lie pas! Le compilateur indique des messages undefined reference to `XXX' car vous n'avez pas précisé les bonnes bibliothèques (options -l de cc ou gcc).

1) Écrivez un script shell qui recherche toutes les bibliothèques définissant un nom de symbole précisé en argument du script. Pour cela, il faut explorer tous les fichiers .a (bibliothèques statiques) et .so (bibliothèques dynamiques). On n'explorera que les répertoires standard des bibliothèques. Attention, ceux-ci dépendent de la configuration système (voir ld(1)).

solution) bibal1.sh.

2) Écrivez maintenant un script qui prend en argument un nombre arbitraire de fichiers .c et qui trouve les bonnes options -l à donner au compilateur. Comme une bibliothèque peut en appeler une autre, il faudra itérer un peu. En sortie, le script doit indiquer un des résultats suivants:

Le script utilisera, si elles existent, les variables d'environnement CC (nom du compilateur), CFLAGS (options de compilations) et LDFLAGS (options le liage, pouvant contenir des options -l prédéfinies par l'utilisateur).


Antoine Miné