Tux

Le système UNIX

TD 6 - Le Bourne Again Shell

C. Drocourt
I.U.T. Amiens
drocourt@iut-amiens.fr

Exercice 1 : L’invite du shell

L’invite du shell est contenu dans la variable PS1 qui, par défaut, contient la chaîne composée par les caractères "dollar" et "espace". Le but de cet exercice est de disposer de l’invite suivante :
<NomUtilisateur> bash <PID du shell courant> : <espace>

Ainsi, pour l’utilisateur Gaston, l’invite sera :
Gaston bash 1234:

1 – Modifier l’invite du shell sur la ligne de commande au niveau du shell de login.
2 – Se déconnecter puis se connecter et constater que la modification précédente n’a pas été mémorisée. Où définir PS1 pour palier à ce défaut ?
3 – Après avoir résolu le cas du shell de connexion, empiler plusieurs shell (commande bash) et constater qu’il y a à nouveau problème. Trouver une solution.

Exercice 2 : Le masque des droits d’accès

1 – Ajouter au fichier de configuration une ligne permettant de masquer les droits ----w-rwx pour les fichiers qui seront créés à l’avenir.
2 – Un utilisateur a choisi un masque de 0. Quel problème va-t-il rencontrer ?
3 – Un autre utilisateur a choisi un masque de 0777. A quel gros problème va-t-il devoir faire face ?

Exercice 3 : Variables locales et variables d'environnement

1 – Définir au niveau de la ligne de commande une variable berliet contenant la chaîne de caractère "Stradair".
2 – Vérifier que la variable berliet est connue du système grâce à la commande set. Afficher son contenu.
3 – Empiler un nouveau shell. Afficher le contenu de berliet. Possible? Vérifier avec set que berliet n'existe pas dans ce shell. Quitter ce shell.
4 – On va résoudre le problème en exportant la variable berliet (commande export ou typeset). Vérifier que berliet fait maintenant partie des variables exportées (variables d'environnement) avec la commande env.
5 – Empiler un nouveau shell. Afficher le contenu de berliet. Possible ? Vérifier avec set et env. Quitter ce shell.
6 – Supprimer cette variable berliet. Vérifier.

Exercice 4 : Exécution de script-shell

1 – Déclarer au niveau de la ligne de commande une variable SM240 valant 'Europe'.
2 – Rédiger un script-shell nommé saviem qui affiche sur stdout le contenu des variables $HOME et SM240, et qui attende 60 secondes.
3 – Lancer ce script-shell en tapant :
. saviem &
Que se passe-t-il ? Tracer la généalogie des processus pour comprendre.
4 – Lancer ce script-shell en tapant :
saviem &
Que se passe-t-il ? Tracer la généalogie des processus pour comprendre.

Exercice 5 : Script-shell et chemin d’accès

1 – Que contient la variable d’environnement $HOME ?
2 – Créer un répertoire $HOME/bin qui contiendra les exécutables réalisés dans le cadre de ce TD.
3 – Rédiger un script-shell nommé heure qui donne l’heure sous le format « Il est exactement hh:mm »
4 – Se placer dans /tmp et tenter d’exécuter heure. Possible ? Si non, résoudre le problème.

Exercice 6 : Les alias

1 – Consulter les différents alias présents dans votre système.
2 – Définir un alias dir correspondant à la commande ls –ail.
3 – Où placer cet alias pour le retrouver à chaque connexion ?

Exercice 7 : Les paramètres positionnels

Ils permettent à un script-shell de récupérer des arguments passés sur la ligne de commande.

Rédiger un script-shell qui traite ses arguments de la façon suivante :
Test si l’argument est la référence d’un fichier ordinaire
Si oui, test si le fichier est lisible
Si oui, affiche <argument> est un fichier régulier et lisible.

Le code de retour sera égal au nombre d’arguments qui sont des références de fichier ordinaires et lisibles.
Au niveau de la ligne de commande, vérifier ce code de retour.

Exercice 8 : Le traitement des exceptions

Rédiger un script-shell nommé attrape réalisant les opérations suivantes :

– Mise en place de traitement associés à certains signaux
    – Le signal SIGTERM doit être ignoré
    – La réception du signal SIGUSR1 doit causer l’affichage du message « Le signal SIGUSR1 a tué le processus <PID> » puis la mort du processus.
    – La réception du signal SIGUSR2 doit causer la destruction du fichier $HOME/bidon, mais pas la mort du processus.
– Affichage du PID du processus courant.
– Création d’un fichier vide de référence $HOME/bidon (commande touch $HOME/bidon).
– Affichage des captages de signaux mis en place.
– Temporisation de vingt secondes.
– Rétablissement des comportements standards à la réception des signaux SIGTERM, SIGUSR1 et SIGUSR2.
– Affichage du message « Comportement standard rétabli ».
– Temporisation de dix secondes.

Lancer ce script-shell en arrière-plan et vérifier que le traitement des signaux a bien été mis en place.

Exercice 9 : Script-shell (I)

Rédiger un script-shell qui détecte si une personne, dont on passe le nom de login en argument, est connectée sous Unix.
Ne pas oublier le test du nombre d’argument et le code de retour.

Exercice 10 : Script-shell (II)

Rédiger un script-shell qui affiche pour les utilisateurs connectés leur nom de login, leur répertoire d’accueil et les droits sur ce répertoire.
Ex :     gaston        /home/gaffeurs/gaston    drwxr-x---
    bertrand    /home/gaffeurs/bertrand    drwxrwxrwx

Exercice 11 : Script-shell (III)

Rédiger un script-shell qui prend trois arguments :
– le premier étant un nom de fichier.
– les deux autres des entiers n1 et n2
et qui affiche les lignes du fichier comprises entre n1 et n2.

Afficher les messages en cas d'erreur (nombre de paramètres incorrect, fichier inexistant, fichier non ordinaire, fichier protégé en lecture, …).