As beautiful as a shell
Un shell Unix simple et fonctionnel développé en C, reproduisant les fonctionnalités de base de bash.
- Description
- Fonctionnalités implémentées
- Compilation et utilisation
- Architecture du projet
- Tests
- Auteurs
Minishell est une implémentation simplifiée d'un shell Unix, développée dans le cadre du curriculum de l'École 42. Ce projet permet de comprendre en profondeur le fonctionnement des processus, des descripteurs de fichiers, et de l'interface entre l'utilisateur et le système d'exploitation.
- ✅ Prompt interactif avec couleurs personnalisées (
minishell:) - ✅ Historique des commandes avec support de readline
- ✅ Recherche et exécution des commandes via PATH ou chemins absolus/relatifs
- ✅ Gestion des signaux :
Ctrl+C: Nouveau prompt sur nouvelle ligneCtrl+D: Sortie du shellCtrl+\: Ignoré (comme dans bash)
- ✅ Simple quotes (
') : Empêche l'interprétation des métacaractères - ✅ Double quotes (
") : Permet l'expansion des variables ($)
- ✅
<: Redirection d'entrée - ✅
>: Redirection de sortie - ✅
<<: Here-document avec délimiteur - ✅
>>: Redirection de sortie en mode append
- ✅
|: Pipeline entre commandes - ✅ Pipes multiples : Support des chaînes de commandes complexes
- ✅ Expansion des variables (
$VAR) - ✅
$?: Code de retour de la dernière commande - ✅ Gestion complète de l'environnement
- ✅
echoavec option-n - ✅
cdavec chemins relatifs et absolus - ✅
pwdsans options - ✅
exportsans options - ✅
unsetsans options - ✅
envsans options ni arguments - ✅
exitsans options
- ✅ Garbage Collector personnalisé pour la gestion mémoire
- ✅ Gestion d'erreurs robuste avec messages informatifs
- ✅ Validation syntaxique des commandes
- ✅ Support des here-documents avec fichiers temporaires
- ✅ Détection automatique des commandes intégrées vs externes
gccouclangmakereadlinelibrary- Système Unix/Linux
# Compilation standard
make
# Compilation en mode debug
make debug
# Nettoyage
make clean # Supprime les fichiers objets
make fclean # Supprime tout
make re # Recompile tout# Lancement du shell
./minishell
# Exemples d'utilisation
minishell: echo "Hello World"
minishell: ls -la | grep .c
minishell: cat < input.txt > output.txt
minishell: echo "test" >> file.txt
minishell: cat << EOF
> Hello
> World
> EOFLe projet suit une architecture modulaire claire :
09_Minishell/
├── main.c # Point d'entrée principal
├── include/
│ └── minishell.h # Définitions et prototypes
├── src/
│ ├── builtins/ # Commandes intégrées
│ ├── env/ # Gestion des variables d'environnement
│ ├── exec/ # Moteur d'exécution
│ ├── parsing/ # Analyseur syntaxique et lexical
│ ├── prompt/ # Interface utilisateur
│ ├── signal/ # Gestion des signaux
│ └── utils/ # Utilitaires et garbage collector
├── lib/ # Bibliothèques externes
└── tests/ # Scripts de test
- Tokenisation : Découpage de la ligne en tokens
- Analyse syntaxique : Validation de la grammaire
- Expansion : Résolution des variables et quotes
- Structure de données : Construction de l'AST des commandes
- Dispatcher : Aiguillage entre commandes simples et pipelines
- Pipes : Gestion des tubes de communication
- Redirections : Manipulation des descripteurs de fichiers
- Here-documents : Traitement des entrées multi-lignes
- Implémentation de toutes les commandes intégrées
- Interface uniforme avec le système d'exécution
- Gestion des codes de retour
- Structure de données pour les variables
- Fonctions d'accès et de modification
- Conversion vers format execve
- Système de gestion mémoire automatisée
- Classification par types (ENV, TKN, CMD, TMP)
- Prévention des fuites mémoire
Le projet inclut plusieurs outils de test :
# Tests basiques
bash tests/tests.sh
# Tests d'expansion
bash tests/expand_test.sh
# Tests avec minishell_tester externe
cd tests/minishell_tester && bash test.sh- ✅ Commandes simples et complexes
- ✅ Pipes multiples
- ✅ Redirections combinées
- ✅ Gestion des erreurs
- ✅ Variables d'environnement
- ✅ Here-documents
- ✅ Gestion des signaux
- Garbage Collector personnalisé avec classification par types
- Libération automatique à la fin de chaque commande
- Prévention des leaks même en cas d'interruption
- Validation syntaxique complète avant exécution
- Gestion d'erreurs avec messages informatifs
- Restauration des descripteurs après redirections
- Nettoyage automatique des fichiers temporaires
- Parsing en une passe avec structures optimisées
- Réutilisation des processus pour les builtins
- Gestion efficace des pipes et redirections
- ~3000 lignes de code C
- 40+ fichiers sources organisés en modules
- 100% Norm compliant (norme 42)
- 0 memory leaks (validé avec Valgrind)
- Support complet des spécifications bash essentielles
- aumartin - Développement principal
- tjacquel - Développement et tests
Développé dans le cadre du cursus de l'École 42