← Retour aux projets

École 42

Minishell

Un interpréteur de commandes façon bash, écrit en C : pipes, redirections, expansion de variables et gestion fine des signaux.

Le contexte

Minishell reconstruit les mécanismes essentiels d'un shell Unix : analyse de la ligne de commande, exécution de processus via fork/pipe/execve, et une gestion des signaux qui reproduit fidèlement le comportement de bash. Projet réalisé en binôme.

Architecture

Le pipeline repose sur un arbre syntaxique plutôt qu'une simple liste de commandes : la ligne est d'abord découpée en tokens, puis transformée par un parseur récursif en un arbre binaire (commande, pipe, ET, OU), lui-même parcouru par un exécuteur récursif. Cette structure gère naturellement les priorités entre opérateurs et les combinaisons complexes de pipes et de conditions.

Expansion & heredocs

L'expansion des variables suit l'ordre réel de bash : substitution des guillemets et des variables, nettoyage des chaînes vides, découpage en mots, expansion des jokers, puis suppression des guillemets restants. Les heredocs sont lus dans un processus fils dédié, avec sa propre gestion de SIGINT et une détection des délimiteurs entre guillemets pour désactiver l'expansion quand nécessaire.

Signaux

Le comportement des signaux reproduit celui de bash au détail près : SIGINT au niveau de l'invite efface la ligne en cours sans quitter le shell, tandis que SIGQUIT n'affiche « Quit: 3 » que lorsqu'un processus fils est en cours d'exécution.