URL:     https://linuxfr.org/news/gameshell-apprendre-les-rudiments-du-shell-en-s-amusant
Title:   GameShell, apprendre les rudiments du shell en s'amusant
Authors: phyve
        Xavier Claude et Pierre Jarillon
Date:    2021-03-25T18:09:58+01:00
License: CC By-SA
Tags:    shell, bash et codingame
Score:   5


Il y a 4 ans, j'ai pris en charge un nouveau cours intitulé « système d'exploitation » en première année de licence. Le programme est assez large, avec un peu d'architecture, un peu de système, et même un peu de réseau. Là dedans, je devais faire une introduction au shell. Le risque avec ce genre du truc, c'est de se retrouver avec un catalogue de commandes qui rebutera même les étudiants les plus motivés.


Et c'est comme ça qu'est né GameShell, ou `gash` pour les intimes. GameShell est un jeu où il faut entrer des commandes dans un shell (`bash`) pour valider des « missions ». Comme il n'y a pas eu de gros bug ces deux dernières années, je me dis que je pouvais en faire la pub. (Attention, il reste probablement plein de bugs. C'est juste que les étudiants ne sont pas encore tombés dessus !). Ça peut intéresser les gens qui veulent apprendre, ou enseigner les rudiments du shell.



Le code est disponible sur GitHub (promis, je changerais un de ces jours) avec une licence GPL : [GameShell sur GitHub](https://github.com/phyver/GameShell)


N'hésitez pas à me faire des retours d'utilisation, des rapports de bugs, proposer des fonctionnalités, ajouter des missions, etc.
Si vous l'utilisez « en public », ça serait juste bien d'inclure un lien vers le dépôt et / ou mon nom.



GameShell est un jeu en ligne de commandes, où le joueur doit taper des commandes `bash` pour valider des « missions ».

----

[GameShell sur github](https://github.com/phyver/GameShell)
[archive « standalone » pour lancer GameShell](https://github.com/phyver/GameShell/raw/master/GameShell.tgz)

----

# GameShell



Pour simplifier, GameShell c'est juste (!?) une session `bash` avec un gros fichier `.bashrc`, et une variable `$HOME` ad-hoc. L'idée de départ est due à R. Lepigre, qui était alors en thèse et qui participait à ce cours.



On effectue des opérations standards sur les fichiers, les répertoires ou les processus dans un contexte plus ludique.



Au démarrage, voila ce qu'on a :



```
$ ./start.sh
============================ Initialisation de GameShell ============================
************************************************
*                                              *
*     Commencez par taper la commande          *
*       $ gash show                            *
*     pour découvrir le premier objectif       *
*     et                                       *
*       $ gash check                           *
*     pour valider vos missions.               *
*                                              *
*     La commande                              *
*       $ gash help                            *
*     affichera la liste des commandes gash.   *
*                                              *
************************************************
[mission 01] $
```





On se retrouve devant un prompt, et on peut commencer les missions. Toutes les commandes utilisées sont standard, sauf la commande `gash`.



```
[mission 01] $ gash show

    _________________________________________________________
()==(                                                        (@==()
    '________________________________________________________'|
      |                                                       |
      | Objectif                                              |
      | ========                                              |
      |                                                       |
      | aller tout en haut du donjon                          |
      |                                                       |
      |                                                       |
      | Commandes utilisées                                   |
      | ===================                                   |
      |                                                       |
      |   cd LIEU                                             |
      |     permet de se déplacer dans un lieu                |
      |                                                       |
      |   pwd                                                 |
      |     permet d'afficher le lieu actuel                  |
      |                                                       |
      |   ls                                                  |
      |     permet d'afficher la liste des lieux accessibles  |
      |     depuis la position actuelle                       |
      |                                                       |
      |                                                       |
      | Rappel                                                |
      | ======                                                |
      |                                                       |
      |   gash restart                                        |
      |     permet de redémarrer la mission à zéro            |
      |                                                       |
    __)_______________________________________________________|
()==(                                                         (@==()
    '--------------------------------------------------------'

[mission 01] $
```





Cette mission n'est pas trop difficile. Voila ce que fait un étudiant typique :



```
[mission 01] $ ls
Chateau  Echoppe  Foret  Montagne
[mission 01] $ cd Chateau
[mission 01] $ ls
Batiment_principal  Cave  Donjon  Entree  Observatoire
[mission 01] $ cd Donjon
[mission 01] $ ls
Premier_etage
[mission 01] $ cd Premier_etage
[mission 01] $ ls
Deuxieme_etage
[mission 01] $ cd Deuxieme_etage
[mission 01] $ ls
Haut_donjon
[mission 01] $ cd Haut_donjon
[mission 01] $ ls
[mission 01] $
```





Toute personne qui ne comprend pas la soluce de cette première mission devrait probablement faire une partie de GameShell !



Pour valider la mission en cours et passer à la suivante, il faut utiliser `gash check`



```
[mission 01] $ gash check

La mission 01 est validée

****************************************
*  Tapez la commande                   *
*    $ gash show                       *
*  pour découvrir l'objectif suivant.  *
****************************************
[mission 02] $
```





Bien sûr, si on n'est pas en haut du Donjon, la mission n'est pas validée, et il faut recommencer à partir du point de départ !



Je vous laisse découvrir la suite, mais les missions deviennent globalement de plus en plus complexes et permettent de se familiariser avec les commandes de bases, les motifs, les fichiers cachés, les redirections, les processus, etc. Tout ça, sous couvert de missions plus ou moins farfelues comme trouver des pièces d'or dans la cave, tuer des générateurs de chats, tricher à une épreuve de calcul mental, etc.



Il y aurait des tas de missions que je voudrais ajouter (quelques options de `ls`, recherche dans l'historique des commandes, liens symboliques, expressions régulières, etc.) mais comme mon TP ne fait que 3h, j'ai du m'arrêter à un moment !



Les retours des étudiants sont plutôt bons. Ils arrivent à faire des trucs assez compliqués et le problème principal est qu'ils ne parviennent pas toujours à réutiliser les commandes dans un contexte moins ludique.



# Utilisation



Pour faire toutes les missions, il faut avoir :



* un terminal avec bash
* les paquets debian / ubuntu `psmisc` `nano` `tree` `x11-apps`



`python3` (pour la génération des « parchemins » et la mission 33) et `gcc` (pour la mission 30) sont également nécessaires mais le joueur ne les utilise pas directement, et ils sont normalement installés par défaut.



## avec l'archive



Après ça, il suffit de récupérer l'archive et l'extraire



```
$ wget https://github.com/phyver/GameShell/raw/master/GameShell.tgz -O -  |  tar -xz
$ ./GameShell/start.sh
..
..
```





Il est toujours possible de quitter GameShell (avec Control-d ou `exit`), et on pourra redémarrer à la mission en cours.



## depuis le répertoire du dépot



Vous pouvez cloner le dépot et lancer GameShell directement



```
$ git clone https://github.com/phyver/GameShell
$ ./GameShell/start.sh
Vous êtes en train d'exécuter GameShell
dans l'arborescence de développement.
Faut-il le continuer ? [o/N] o
..
```





Il n'y a normalement pas de problème à lancer GameShell dans le répertoire de développement.



# La suite



Si l'intérêt suscité par cette dépêche est suffisant, je ferai une deuxième partie avec un peu plus de détails techniques :


* les commandes spécifiques GameShell
* créer des nouvelles missions
* architecture de GameShell
* des trucs à faire, ou pas



Amusez vous bien !