Minishell est une implémentation d'un shell UNIX minimaliste développée en C dans le cadre du cursus de l'École 42. Ce projet reproduit les fonctionnalités essentielles d'un shell moderne (bash/zsh) en respectant les standards POSIX.
- mbah - Parsing, tokenisation, expansion des variables, gestion des signaux
- Jonathan (jbialung) - Exécution des commandes, builtins, debugging, gestion des fuites mémoire
MiniShell/
├── inc/ # Headers
│ └── minishell.h # Header principal avec toutes les structures
├── src/
│ ├── main.c # Point d'entrée, boucle principale
│ ├── parser/ # Module de parsing (mbah)
│ │ ├── tokenizer.c # Tokenisation de la ligne de commande
│ │ ├── quote_parser.c # Gestion des guillemets simples/doubles
│ │ ├── expand_variables.c # Expansion des variables d'environnement
│ │ ├── env_utils.c # Utilitaires pour les variables d'env
│ │ ├── get_env_key_and_value.c # Récupération clé/valeur des variables
│ │ ├── command_list_builder.c # Construction de la liste de commandes
│ │ ├── parser_command_args.c # Parsing des arguments de commandes
│ │ └── redirections_utils.c # Gestion des redirections
│ ├── execution/ # Module d'exécution (Jonathan)
│ │ ├── execution.c # Orchestration de l'exécution
│ │ ├── process_exec.c # Exécution des processus enfants
│ │ ├── builtin_exec.c # Exécution des builtins
│ │ └── exec_path_resolver.c # Résolution des chemins d'exécution
│ ├── builtins/ # Commandes intégrées (Jonathan)
│ │ ├── cd_builtin.c # Commande cd avec support CDPATH
│ │ ├── echo_builtin.c # Commande echo avec option -n
│ │ ├── env_builtin.c # Affichage des variables d'environnement
│ │ ├── exit_builtin.c # Commande exit avec gestion des codes
│ │ ├── export_builtin.c # Export de variables d'environnement
│ │ ├── pwd_builtin.c # Affichage du répertoire courant
│ │ ├── unset_builtin.c # Suppression de variables d'environnement
│ │ └── handle_builtins.c # Dispatcher des builtins
│ └── utils/ # Utilitaires partagés
│ ├── signal_handlers.c # Gestion des signaux (mbah)
│ ├── process_signals.c # Signaux des processus (mbah)
│ ├── heredoc.c # Implémentation des here-documents
│ ├── cleanup.c # Nettoyage mémoire et erreurs
│ └── [autres utilitaires]
├── libft/ # Bibliothèque personnelle
└── Makefile # Configuration de compilation
- Lexer intelligent : Reconnaissance automatique des tokens (commandes, arguments, opérateurs)
- Gestion des quotes : Support complet des guillemets simples et doubles avec états imbriqués
- Détection d'erreurs syntaxiques : Validation des pipes mal placés, guillemets non fermés
- Variables d'environnement :
$VAR,$PATH, etc. - Variable spéciale :
$?(code de retour de la dernière commande) - Protection par quotes : Les simples quotes désactivent l'expansion
- Gestion des cas limites : Variables inexistantes, expansions imbriquées
- SIGINT (Ctrl+C) : Interruption propre avec nettoyage readline
- SIGQUIT (Ctrl+\) : Gestion différenciée entre processus parent/enfant
- Codes de retour conformes : 130 pour SIGINT, 131 pour SIGQUIT
- Protection des processus : Isolation correcte parent/enfant
- Fork/exec sophistiqué : Création et gestion des processus enfants
- Gestion des pipes : Pipeline complexe avec redirections multiples
- Résolution de chemin : Recherche intelligente dans
$PATH - Gestion des erreurs : Codes de retour standards UNIX
cd: Support deCDPATH,~,-, gestion d'erreursecho: Option-n, échappements, compatibilité bashexport: Variables avec/sans valeur, affichage formatéunset: Suppression de variables avec validationenv: Affichage des variables d'environnementpwd: Répertoire courant avec gestion d'erreursexit: Codes de sortie, validation des arguments
- Détection de fuites mémoire : Implémentation de cleanup systématique
- Gestion d'erreurs robuste : Validation de tous les malloc/free
- Optimisation des performances : Minimisation des allocations dynamiques
>(Truncate) : Redirection avec écrasement>>(Append) : Redirection en mode ajout<(Input) : Redirection d'entrée<<(Here-document) : Heredoc avec délimiteur personnalisé
- Pipes multiples :
cmd1 | cmd2 | cmd3 - Combinaison redirections/pipes :
cmd < file | cmd2 > output - Gestion des descripteurs : Fermeture automatique et propre
# Système requis
- macOS ou Linux
- gcc/clang
- make
- readline library (brew install readline sur macOS)git clone https://github.com/mbah24-dev/MiniShell.git
cd MiniShell
make
./minishell# Lancement du shell
./minishell
# Exemples de commandes
minishell% echo "Hello World" | cat -e
minishell% export VAR="test" && echo $VAR
minishell% ls -la | grep ".c" > output.txt
minishell% cd .. && pwd
minishell% exit 42- Signaux : Validation des codes de retour SIGINT/SIGQUIT
- Memory leaks : Tests avec valgrind et sanitizers
- Edge cases : Guillemets imbriqués, pipes complexes, redirections multiples
- Compatibilité bash : Comparaison comportementale
# Compilation avec debug
make DEBUG=1
# Tests de fuites mémoire
valgrind --leak-check=full ./minishell
# Tests avec sanitizers
make SANITIZER=1- POSIX Standards : Spécifications officielles des shells UNIX
- GNU Bash Manual : Référence pour le comportement attendu
- Advanced Unix Programming : Stevens & Rago - Gestion des processus
- Linux System Programming : Robert Love - Signaux et IPC
- Parsing & Lexical Analysis : Conception de parseurs en C
- Process Management : fork(), execve(), wait(), signaux
- File Descriptors : dup2(), pipes, redirections
- Memory Management : Allocation dynamique, évitement des fuites
- UNIX Philosophy : "Do one thing and do it well"
- Gestion des signaux : Isolation correcte parent/enfant
- Parsing robuste : Gestion des cas edge (quotes, expansions)
- Memory management : Zero leak policy avec structures complexes
- Pipes complexes : Gestion des descripteurs multiples
- Compatibilité shell : Reproduction fidèle du comportement bash
- Architecture modulaire : Séparation claire des responsabilités
- Error handling : Gestion exhaustive des cas d'erreur
- Documentation : Commentaires détaillés et documentation technique
- Standards respect : Conformité aux normes 42 et POSIX
- Optimisation mémoire : Structures de données efficaces
- Algorithmes optimisés : Parsing et exécution performants
- Resource management : Fermeture systématique des descripteurs
- ✅ 101/100 - Projet validé avec bonus
- ✅ Zero memory leaks - Validation valgrind complète
- ✅ Tous les tests fonctionnels - Comportement conforme à bash
- ✅ Gestion avancée des signaux - Codes de retour corrects
- ✅ Architecture extensible - Code maintenable et évolutif
Ce projet a été une excellente expérience de pair programming :
- mbah : Focus sur la robustesse du parsing et la gestion système
- Jonathan : Expertise en debugging et optimisation des performances
- Synergie : Code review mutuel et résolution collaborative des bugs complexes
Ce projet est développé dans le cadre du cursus de l'École 42. Le code est disponible à des fins éducatives.
