Consignes
Ce sujet de TP comporte quelques "mini projets" qui utilisent certaines des notions vues en cours, TD ou TP. L'objectif est de réaliser 1 ou 2 (ou même plus) de ces mini projets.
Avant de commencer un des projet, il est impératif de faire la section Préliminaires.
Le rendu du TP consistera en une archive (fichier .zip, .tar, etc.) comportant votre travail.
-
L'archive contiendra un répertoire par projet que vous avez commencé.
-
Chaque répertoire comportera, en plus des fichiers nécessaires au fonctionnement du mini projet, un fichier au format texte appelé README qui contiendra
-
vos noms et prénoms,
-
vos remarques sur le projet en question,
-
une documentation utilisateur.
-
-
Vous devrez en plus ajouter un fichier README principal répondant à la question 1.
Attention, les fichiers README seront pris en compte pour l'évaluation du TP...
Liens utiles
-
email des enseignants (Chambéry) gerald.cavallini@univ-smb.fr, pierre.hyvernat@univ-smb.fr, bernard.caron@univ-smb.fr, peio.borthelle@univ-smb.fr, elie.eid@univ-smb.fr,
-
email des enseignants (Annecy) Sebastien.Monnet@univ-smb.fr, Leopold.Crestel@univ-smb.fr
-
le sujet du TP3 sur les bases de la programmation shell
Objectifs du TP
L'objectif de ce TP est de réaliser, un ou plusieurs scripts utilisant les notions utilisés dans les TP précédents. Les scripts proposés ont été choisis soit pour illustrer spécifiquement des points importants, soit parce qu'ils correspondent à des vrais besoins.
Le premier script (système de favoris) est assez détaillé. Le second script devra être réalisé en autonomie, avec une description beaucoup plus sommaire. Ce second script pourra être choisi parmi plusieurs scripts proposés dans le sujet. (Si vous avez une autre idée, vous pouvez discuter avec votre encadrant de TP afin de savoir si vous pouvez remplacer un des scripts proposés par autre chose...)
(répondre à cette question juste avant d'envoyer votre dernière soumissions !)
-
Que pensez vous de la programmation shell ? En particulier, essayez de comparer, en quelques lignes, les avantages et inconvénient des langages bash et Python.
Est-ce que les projets que vous avez fait seraient plus difficiles, ou plus facile si vous deviez les faire en Python ?
-
Donnez deux exemples (ou plus) de taches qui pourraient être "facilement" scriptables. Vous pouvez vous inspirer des projets proposés dans le sujet, ou en inventer de nouvelles.
Reportez vous à la page compléments sur le shell et commandes utiles pour une description des fonctionnalités utiles du shell.
Préliminaires
-
Lisez les sections fonctions shell et boucle sur les arguments d'une fonction et arguments individuels d'une fonction.
-
Téléchargez le fichier mon_premier_script.sh, lisez le et testez le.
$ source mon_premier_script.sh $ affiche_fichiers * uhesantuhensa lettre.txt : fichier mon_premier_script.sh : fichier FIN de la fonction affiche_fichiers
-
En vous inspirant de la fonction
affiche_fichiers
, écrivez une fonctiontypes
qui, pour chacun de ses argument, affiche son type :-
fichier,
-
dossier,
-
inconnu.
-
-
N'oubliez pas de tester...
Par Exemple
$ source mon_premier_script.sh $ types * uhesantuhensa Bureau : dossier info201 : dossier lettre.txt : fichier mon_premier_script.sh : fichier tmp : dossier uhesantuhensa : inconnu
1. Un système de favoris pour le shell
1.1. Description
Lorsque je travaille dans un terminal, certains répertoires reviennent très
souvent. C'est par exemple le cas de mon dossier personnel. Le shell offre un
raccourci pour se déplacer dans le dossier personnel : la commande
cd
sans argument.
Je ne peux par contre pas sauvegarder d'autre répertoires "favoris" pour pouvoir m'y déplacer facilement.
1.2. Objectif
L'objectif de ce mini projet est de créer un petit système de "favoris" pour vos répertoires importants.
Votre script devra fournir 4 fonctions :
-
A
(Add) pour sauvegarder un nouveau favori. Cette fonction prend un argument (une chaine sans espace) et ajoute le répertoire courant dans votre liste de favoris. -
C
(Change) pour se déplacer dans un répertoire favori. Cette fonction prend un argument (un chaine sans espace) et cherche dans vos favoris. Si le favori existe, la fonction change le répertoire de travail, sinon, elle ne fait rien. -
R
(Remove) pour supprimer un favori de la liste. -
L
(List) pour afficher la liste de tous les favoris.
Exemple d'utilisation
$ source favoris.sh
$ pwd
/home/hyvernat/info201/TP/sujets/TP4
$ A info201-4
Le répertoire /home/hyvernat/info201/TP/sujets/TP4 est sauvegardé dans vos favoris.
raccourci : info201-4
$ cd
$ pwd
/home/hyvernat/
$ C info201-4
Vous êtes maintenant dans le répertoire /home/hyvernat/info201/TP/sujets/TP4.
$ pwd
/home/hyvernat/info201/TP/sujets/TP4
$ R info201-4
Le favoris "info201-4" est supprimé de votre liste.
$ cd
$ C info201-4
Le favoris "info201-4" n'existe pas.
1.3. Précisions
Chacune des 4 fonctions demandées ne fait que quelques lignes. N'hésitez pas à demander à votre encadrant si vous pensez que vous faites des choses trop complexes.
Sauvegarde des favoris
Votre script utilisera un fichier (caché) .favoris_bash qui sera créé dans votre dossier personnel. Ce fichier contiendra une ligne par favori. Chaque ligne contiendra
-
le nom du favori (une chaine sans espace),
-
un espace,
-
la chaine de caractères "->",
-
un espace,
-
le chemin absolu du répertoire correspondant.
Créez un fichier favoris.sh pour contenir les fonctions que vous allez écrire.
-
N'oubliez pas de mettre
#!/bin/bash
en première ligne et de mettre quelques commentaires avec au minimum vos noms et filières.
-
Définissez une variable shell
FAV
qui prendra la valeur$HOME/.favoris_bash
. Il s'agira du fichier qui contiendra vos favoris... -
Définissez une fonction
A
qui permettra de sauver un nouveau favori en affichant un petit message.Les points importants sont :
-
cette fonction utilisera son premier argument
$1
comme nom du favori, -
le nom du répertoire courant est contenu dans la variable
$PWD
, -
on peut ajouter une ligne dans le fichier des favoris (variable
$FAV
) avec la commandeecho
et une redirection>>
. -
vous utiliserez la chaine -> pour séparer le nom du favori de son chemin d'accès.
-
-
Testez votre fonction. Par exemple :
$ source favoris.sh $ A info201-3 Le répertoire /home/hyvernat/info201/TP/sujets/TP4 est sauvegardé dans vos favoris. raccourci : info201-3 $ cd ~/Téléchargements $ A tel Le répertoire /home/hyvernat/Téléchargements est sauvegardé dans vos favoris. raccourci : tel $ cat ~/.favoris_bash info201-3 -> /home/hyvernat/info201/TP/sujets/TP4 tel -> /home/hyvernat/Téléchargements
Affichage des favoris
Ajoutez maintenant la fonction L
qui permet d'afficher la liste
des favoris sauvegardés. Pour cela, il suffit d'afficher le contenu du fichier
$FAV
...
Pour rendre l'affichage plus joli, vous pouvez utiliser la commande
column -t
qui aligne le contenu d'un fichier par colonnes.
Remarque : cette fonction n'utilise aucun argument !
Suppression d'un favori
Ajoutez maintenant la fonction R
qui permet de supprimer le
favori donné en argument ($1
).
Pour cela, le plus simple est d'utiliser la commande
grep -vw "^MOT" FICHIER
qui affiche toutes les lignes de FICHIER
, sauf celles qui
commencent par MOT
. (Attention, le ^
est
nécessaire.)
En redirigeant le résultat de cette commande dans un fichier (avec
>
), vous pouvez supprimer un favori...
Attention, il n'est en général pas possible de rediriger le résultat d'une commande sur un fichier dans le même fichier. Par exemple,
$ grep "CHAINE" FICHIER > FICHIER
n'aura pas l'effet attendu car la redirection > FICHIER
supprime le contenu avant que la commande grep "CHAINE" FICHIER
ne commence.
Pour faire ceci, il faut donc rediriger la commande dans un fichier
temporaire, et remplacer ensuite le fichier d'origine par ce fichier
temporaire avec la commande mv SOURCE DESTINATION
.
Utilisation d'un favori
La fonction la plus importante est C
qui permet de se déplacer
dans un répertoire sauvegardé dans un favori.
L'objectif est de récupérer le chemin d'accès associé au favori donné en
argument (variable $1
) et de le sauvegarder dans une variable
CHEMIN
, puis de d'effectuer la commande
cd $CHEMIN
On peut récupérer ce chemin avec une commande complexe :
CHEMIN=$(COMMANDE)
La commande en question pourra par exemple utiliser
-
l'utilitaire
grep
pour ne regarder que la ligne qui commence par le bon favorigrep -w "MOT" FICHIER
n'affiche que les lignes du fichier qui commencent par
MOT
-
l'utilitaire
cut
qui permet de ne conserver que certaines colonnes des lignes d'un fichier. Pour que les colonnes soient séparées par des espaces, il faut utilisercut -d" " -fCHAMPS
où
CHAMPS
est une liste des colonnes à afficher.Remarque : chaque ligne du fichier de favoris est de la forme
FAVORI -> CHEMIN
où
FAVORI
ne contient pas d'espace. Le chemin est donc constitué de la colonne numéro 3. (Ou, si CHEMIN contient des espaces, de toutes les colonnes à partir de la 3ème...) -
une redirection
CMD1 | CMD2
pour faire agirCMD2
sur le résultat affiché parCMD1
.
Cette manière de procéder permet d'éviter de faire une boucle sur le fichier de favoris !
Chargement automatique (facultatif)
Vous pouvez maintenant créer un répertoire ~/.bash_scripts et y copier votre fichier favoris.sh.
Pour charger automatiquement vos scripts, ajoutez les lignes suivantes dans votre fichier ~/.bashrc :
if [ -d ~/.bash_scripts ]
then
for FILE in ~/.bash_scripts/*.sh
do
source $FILE
done
fi
Normalement, vos scripts seront chargés à chaque lancement d'un nouveau shell...
1.4. Pour aller plus loin
Vous pouvez essayer d'améliorer votre script, par exemple avec les fonctionnalités suivantes :
-
autoriser les noms de favori incomplets :
C info201
utilisera le favoriinfo201-3
s'il existe. La fonctionC
devra donc-
chercher les favoris "compatibles"
-
s'il n'y en a qu'un seul, elle l'utilise
-
s'il y a un favori "exact", elle l'utilise
-
sinon, elle affiche un message et ne fait rien
-
-
Autoriser une chaine pour la commande
L
afin de ne lister que les favoris contenant une chaine de caractères. -
etc.
2. Autre mini projet
Choisissez un autre projets parmi les suivants :