Interpréteur de commandes UNIX (shell) en C, inspiré de bash.
Projet de l'école 42.
Créé le 02/02/2023 · Dernière mise à jour : 29/08/2026
Afficher le sommaire
Minishell est une réimplémentation minimaliste d'un interpréteur de commandes UNIX (shell) écrit en C, réalisée en binôme dans le cadre du tronc commun de l'école 42. L'objectif : comprendre ce qui se passe réellement derrière un terminal, les processus, les descripteurs de fichiers, les pipes et les signaux.
Le shell lit une ligne avec readline, la parse, puis exécute la commande via fork / execve / wait, en gérant les builtins, les pipes et la redirection de sortie.
| Ressource | Lien |
|---|---|
| Fiche du projet (portfolio) | Minishell, ZehdBox |
| Code source | github.com/Lamizana/Minishell |
| Catégorie | Détail |
|---|---|
| Builtins | echo (option -n), cd, pwd, export, unset, env, exit |
| Commandes externes | Résolution via PATH (execve) et exécutables locaux ./programme |
| Pipes | Enchaînement simple et multiple avec | |
| Redirection | Redirection simple de sortie > |
| Quotes | Simple '...' et double "..." |
| Variables | Expansion $VAR et code de sortie $? |
| Signaux | Ctrl-C interrompt la commande et réaffiche le prompt, Ctrl-\ ignoré, Ctrl-D (EOF) quitte le shell |
| Prompt | Coloré (chemin courant) avec historique readline |
Le cœur du projet est la boucle REPL (Read - Eval - Print - Loop), cycle fondamental de tout shell interactif :
- Read : la ligne est lue au clavier via
readline(), puis ajoutée à l'historique avecadd_history(). - Eval : la ligne est transformée par le pipeline de parsing : expansion des variables (
$VAR,$?), espacement des|, découpage en arguments (le splitter ignore les séparateurs entre quotes) et nettoyage des quotes résiduelles. La commande est ensuite exécutée. - Print : la sortie du programme est écrite sur la sortie standard (
dup2versSTDOUT_FILENO). - Loop : le shell libère la mémoire, réaffiche le prompt et attend la saisie suivante, jusqu'à
exitouCtrl-D.
saisie utilisateur
│
▼
readline() + add_history()
│
▼
parsing ──► $VAR / $? ──► découpage (pipes, quotes)
│
▼
fork() ─► execve() ─► wait() (commande simple)
│
└─► pipes : dup2() relie la sortie d'un enfant à l'entrée du suivantNote
Le projet se limite volontairement au périmètre du sujet : la redirection de sortie > est gérée, mais >>, < et les heredocs ne sont pas implémentés.
- Un compilateur C (clang recommandé)
- La bibliothèque readline (en-têtes de développement)
- make
- Linux / macOS
git clone https://github.com/Lamizana/Minishell.git
cd MinishellInstallation des dépendances selon le système :
# Debian / Ubuntu
sudo apt install clang libreadline-dev
# macOS (Homebrew)
brew install readlinePuis compilation :
make reNote
Le Makefile compile libft puis l'exécutable minishell avec les drapeaux -Wall -Werror -Wextra -g et l'édition de liens à -lreadline.
| Bibliothèque | Rôle |
|---|---|
libft |
Bibliothèque C personnelle (réimplémentation partielle de la libc), qui sert de base au projet |
| GNU Readline | Édition de ligne interactive, historique et gestion du prompt (-lreadline) |
./minishellQuelques exemples une fois le prompt affiché :
minishell$ echo "hello" | tr a-z A-Z
minishell$ ls -l > out.txt
minishell$ export NAME=42 && echo $NAME
minishell$ cd /tmp && pwd
minishell$ ./minishell # lancement d'un exécutable localTip
L'historique est actif : utilisez les flèches ↑/↓ pour naviguer dans les commandes précédentes.
Minishell/
├── libft/ # bibliothèque C personnelle (réimplémentation partielle de la libc)
├── minishell_tester/ # suite de tests (scripts + cas de test)
├── utils/ # documents annexes (sujets PDF, palette de couleurs)
├── *.c # sources : parsing, builtins, pipes, redirections, execve
├── minishell.h # en-têtes, structures et prototypes
├── Makefile # build : all / clean / fclean / re
├── NOTES.md # notes d'étude (fonctions autorisées, appels système)
├── vsupp # fichier de suppressions Valgrind (fuites de readline)
└── README.mdVérification des fuites mémoire avec Valgrind et le fichier de suppressions :
valgrind --leak-check=full --show-leak-kinds=all --suppressions=vsupp ./minishellNote
readline génère environ 215 blocs non libérés (comportement connu de la bibliothèque), neutralisés via le fichier de suppressions vsupp.
| Fichier | Descriptif |
|---|---|
NOTES.md |
Notes d'étude : fonctions autorisées, appels système et réflexion sur le projet |
minishell_tester/ |
Suite de tests du shell (builtins, pipes, redirections, etc.) |
Projet pédagogique 42 : les corrections et les remarques sont bienvenues via une issue ou une pull request.
Les messages de commit suivent Conventional Commits :
<type>(<scope>): <description>
| Type | Usage |
|---|---|
feat |
Nouvelle fonctionnalité |
fix |
Correction de bug |
docs |
Documentation seule |
refactor |
Réécriture sans changement de comportement |
chore |
Maintenance (configuration, fichiers annexes) |
Scopes : parsing, builtins, exec, pipes, readline, readme, deps.
Alex Lamizana, étudiant à 42 Angoulême, spécialisation Data & IA (projet réalisé en binôme avec vsaura)
- 42 Angoulême : cadre pédagogique du projet
- Valgrind : outil de vérification mémoire utilisé pour les tests
Ce projet a été réalisé conformément à la norme et au sujet officiel de 42.