Contrôle Final 1 – Année 2015/2016
Pour faire les exercices, vous avez besoin de connaître le langage bash. Vous pouvez vous référer à l'annexe shell que vous pouvez trouver ici.
Pour faire le contrôle, vous aurez aussi besoin des scripts
et .
On vous rappelle que vous devez exécuter vos scripts pour les tester. Si les scripts
ne peuvent pas s'exécuter, vous perdrez des points.
Préparation (2 points, ∼5mn)
Créez un répertoire Nom_Prenom, où Nom est
votre nom et Prenom votre prénom. Dans ce répertoire,
vous devez créer des sous répertoires nommés exo2 et
exo3 dans lesquels vous mettrez les scripts des différents exercices.
À la fin du contrôle, vous devez rendre une archive contenant exactement
cette arborescence. On vous rappelle que vous pouvez créer une archive
de la façon suivante :
$ tar -f Nom_Prenom.tgz -cz Nom_Prenom
Explorateur de fichier (7 points, ∼25mn)
(5 points)
On souhaite écrire un script lsfic.sh
qui prend un fichier en argument. Un appel possible est :
./lsfic.sh fic.
Le but de ce script est d'écrire, dans le fichier fic
le nom de chacun des éléments du répertoire courant, 1 élément par ligne,
en faisant précéder le nom par «dir: » s'il s'agit d'un répertoire et
«fic: » s'il s'agit d'un fichier.
Si le paramètre fic n'est pas donné, le script doit se terminer
en affichant un message d'erreur.
Une exécution possible est :
$ ./lsfic.sh
Please, give the name of a file
$ ./lsfic.sh fic
$ cat fic
fic: exo-lsfic.php
fic: lsfic.sh
dir: rigolo
(1 point)
Ajouter en commentaire à la fin du fichier lsfic.sh la commande
permettant de rendre le script lsfic.sh exécutable uniquement
pour l'utilisateur. On vous rappelle qu'un commentaire en shell est indiqué par le
caractère « # ».
(1 point)
On souhaite maintenant que, lorsque l'utilisateur écrit lsfic.sh fic
à partir de n'importe quel répertoire, le script soit lancé.
Ajouter en commentaire à la fin du fichier lsfic.sh la commande
permettant d'y parvenir.
Compteur (11 points, ∼45mn)
(3 points)
On souhaite écrire un premier script nommé incr.sh
qui prend un unique paramètre en argument. Un appel possible
est :
On suppose que fic est un fichier contenant (uniquement) un nombre entier.
Le but de incr.sh est d'incrémenter la valeur se trouvant dans fic,
c'est-à-dire de :
$ ./incr.sh fic
- vérifier que l'argument fic a bien été donné,
- lire le contenu du fichier fic dans une variable var,
- afficher var,
- incrémenter var,
- écrire la nouvelle valeur de var dans le fichier fic,
- retourner (avec exit) la valeur de var.
$ ./incr.sh
Please, give a file name
$ echo 41 > fic
$ ./incr.sh fic
$ echo $?
42
$ cat fic
42
On vous rappelle que la variable $? contient le code de retour de la dernière commande
lancée, c'est-à-dire la valeur indiquée en paramètre du exit dans la sous-commande.
(3 points)
On souhaite maintenant écrire un fichier clock.sh qui prend un unique
paramètre en argument. Un appel possible est :
Ce script doit exécuter une boucle infinie qui, dans l'ordre :
$ ./clock.sh fic
- appel incr.sh avec comme paramètre fic;
- affiche le PID du processus suivi du code de retour de incr.sh;
- dort une seconde avec sleep.
$ echo 0 > fic
$ ./clock.sh fic
15640: 1
15640: 2
15640: 3
On vous rappelle qu'une boucle infinie s'écrit de la façon suivante :
while true; do
...
done
(3 points)
On souhaite maintenant que l'exécution de ./clock.sh & ./clock.sh
ne perde jamais une incrémentation. En particulier, lorsque vous lancez vos scripts,
vous ne devez jamais voir le même nombre précédé de deux PID différents.
Par exemple, l'exécution suivante est éronnée :
Alors que celle-ci est correcte :
Copiez votre script clock.sh dans un script nommé clock2.sh
et modifiez le script clock2.sh en conséquence.
$ echo 0 > fic; ./clock.sh fic & ./clock.sh fic
[2] 15679
15679: 1
15680: 2
15679: 3
15680: 3
$ echo 0 > fic; ./clock2.sh fic & ./clock2.sh fic
[2] 20460
20461: 1
20460: 2
20461: 3
20460: 4
20461: 5
(2 point)
Lorsque l'utilisateur envoie un signal SIGINT, le script clock2.sh
doit maintenant se terminer en affichant Morituri te salutant!.
Copiez votre script clock2.sh dans un script nommé clock3.sh
et modifiez le script clock3.sh en conséquence.