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.

Attention, les fichiers README seront pris en compte pour l'évaluation du TP...

Liens utiles

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 !)

  1. 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 ?

  2. 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

  1. Lisez les sections fonctions shell et boucle sur les arguments d'une fonction et arguments individuels d'une fonction.

  2. 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
  3. En vous inspirant de la fonction affiche_fichiers, écrivez une fonction types qui, pour chacun de ses argument, affiche son type :

    • fichier,

    • dossier,

    • inconnu.

  4. N'oubliez pas de tester...

    Par Exemple

    $ source mon_premier_script.sh
    $ types * uhesantuhensa
    Bureau : dossier
    info202 : 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 :

Exemple d'utilisation

$ source favoris.sh
$ pwd
/home/hyvernat/info202/TP/sujets/TP3
$ A info202-3
  Le répertoire /home/hyvernat/info202/TP/sujets/TP3 est sauvegardé dans vos favoris.
  raccourci : info202-3
$ cd
$ pwd
/home/hyvernat/
$ C info202-3
  Vous êtes maintenant dans le répertoire /home/hyvernat/info202/TP/sujets/TP3.
$ pwd
/home/hyvernat/info202/TP/sujets/TP3
$ R info202-3
  Le favoris "info202-3" est supprimé de votre liste.
$ cd
$ C info202-3
  Le favoris "info202-3" 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

Créez un fichier favoris.sh pour contenir les fonctions que vous allez écrire.

  1. N'oubliez pas de mettre

    #!/bin/bash
    

    en première ligne et de mettre quelques commentaires avec au minimum vos noms et filières.

  2. Définissez une variable shell FAV qui prendra la valeur $HOME/.favoris_bash. Il s'agira du fichier qui contiendra vos favoris...

  3. 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 commande echo et une redirection >>.

    • vous utiliserez la chaine -> pour séparer le nom du favori de son chemin d'accès.

  4. Testez votre fonction. Par exemple :

    $ source favoris.sh
    $ A info202-3
      Le répertoire /home/hyvernat/info202/TP/sujets/TP3 est sauvegardé dans vos favoris.
      raccourci : info202-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
    info202-3 -> /home/hyvernat/info202/TP/sujets/TP3
    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

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 :

2. Autre mini projet

Choisissez un autre projets parmi les suivants :