Skip to content

Bienvenue dans Minishell, un projet inspiré du shell Unix, développé dans le cadre de la formation à l'école 42. L'objectif principal de ce projet est de créer un shell minimaliste en C, capable de gérer des commandes, des redirections, des pipes et plus encore.

License

Notifications You must be signed in to change notification settings

mbah24-dev/MiniShell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

69 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🖥️ Minishell - Shell UNIX Minimaliste

Mini Shell 42 project badge

📋 Présentation du Projet

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.

👥 Équipe de Développement

  • mbah - Parsing, tokenisation, expansion des variables, gestion des signaux
  • Jonathan (jbialung) - Exécution des commandes, builtins, debugging, gestion des fuites mémoire

🏗️ Architecture du Projet

Structure des Dossiers

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

⚙️ Fonctionnalités Implémentées

🔍 Module de Parsing (mbah)

Tokenisation Avancée

  • 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

Expansion des Variables

  • 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

Gestion des Signaux

  • 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

Module d'Exécution (Jonathan)

Gestion des Processus

  • 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

Builtins Complets

  • cd : Support de CDPATH, ~, -, gestion d'erreurs
  • echo : Option -n, échappements, compatibilité bash
  • export : Variables avec/sans valeur, affichage formaté
  • unset : Suppression de variables avec validation
  • env : Affichage des variables d'environnement
  • pwd : Répertoire courant avec gestion d'erreurs
  • exit : Codes de sortie, validation des arguments

Debugging & Optimisation

  • 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

🔄 Redirections et Pipes

Redirections

  • > (Truncate) : Redirection avec écrasement
  • >> (Append) : Redirection en mode ajout
  • < (Input) : Redirection d'entrée
  • << (Here-document) : Heredoc avec délimiteur personnalisé

Pipes

  • Pipes multiples : cmd1 | cmd2 | cmd3
  • Combinaison redirections/pipes : cmd < file | cmd2 > output
  • Gestion des descripteurs : Fermeture automatique et propre

🛠️ Installation et Utilisation

Prérequis

# Système requis
- macOS ou Linux
- gcc/clang
- make
- readline library (brew install readline sur macOS)

Compilation

git clone https://github.com/mbah24-dev/MiniShell.git
cd MiniShell
make
./minishell

Utilisation

# 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

🧪 Tests et Validation

Tests de Conformité

  • 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

Outils de Debug

# Compilation avec debug
make DEBUG=1

# Tests de fuites mémoire
valgrind --leak-check=full ./minishell

# Tests avec sanitizers
make SANITIZER=1

📚 Ressources et Apprentissages

Documentation Consultée

  • 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

Concepts Maîtrisés

  • 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"

Défis Techniques Surmontés

  1. Gestion des signaux : Isolation correcte parent/enfant
  2. Parsing robuste : Gestion des cas edge (quotes, expansions)
  3. Memory management : Zero leak policy avec structures complexes
  4. Pipes complexes : Gestion des descripteurs multiples
  5. Compatibilité shell : Reproduction fidèle du comportement bash

🎯 Points d'Excellence

Code Quality

  • 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

Performance

  • Optimisation mémoire : Structures de données efficaces
  • Algorithmes optimisés : Parsing et exécution performants
  • Resource management : Fermeture systématique des descripteurs

📈 Résultats

  • 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

🤝 Collaboration

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

📄 Licence

Ce projet est développé dans le cadre du cursus de l'École 42. Le code est disponible à des fins éducatives.

About

Bienvenue dans Minishell, un projet inspiré du shell Unix, développé dans le cadre de la formation à l'école 42. L'objectif principal de ce projet est de créer un shell minimaliste en C, capable de gérer des commandes, des redirections, des pipes et plus encore.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •