mirror of
https://github.com/Ladebeze66/minishell.git
synced 2025-12-15 21:56:58 +01:00
153 lines
6.4 KiB
Markdown
153 lines
6.4 KiB
Markdown
# minishell
|
||

|
||
Le projet Minishell de l'École 42 consiste à développer un interpréteur de commandes minimaliste, inspiré de bash. Ce projet vise à familiariser les étudiants avec le fonctionnement interne des shells, en mettant l'accent sur le parsing, la gestion des processus, la synchronisation et la gestion des signaux.
|
||
|
||
🎯 Objectifs du Projet
|
||
Compréhension des Shells Unix : Apprendre le fonctionnement des shells, qui fournissent une interface en ligne de commande pour interagir avec le système.
|
||
|
||
Gestion des Processus : Mettre en œuvre la création, la synchronisation et la terminaison des processus pour exécuter des commandes utilisateur.
|
||
|
||
Gestion des Signaux : Manipuler les signaux pour gérer les interruptions et les commandes intégrées, telles que Ctrl+C pour interrompre un processus.
|
||
|
||
Implémentation des Redirections et des Pipes : Gérer les redirections d'entrée/sortie (<, >, >>) et les pipes (|) pour permettre la communication entre processus.
|
||
|
||
🛠️ Spécifications Techniques
|
||
|
||
Fonctionnalités à Implémenter :
|
||
|
||
Affichage d'un Prompt : Afficher un prompt personnalisé en attente des commandes de l'utilisateur.
|
||
|
||
Historique des Commandes : Maintenir un historique des commandes exécutées pour permettre la navigation et la réexécution.
|
||
|
||
Exécution des Commandes : Localiser et exécuter les exécutables en se basant sur la variable d'environnement PATH ou via un chemin absolu.
|
||
|
||
Gestion des Citations Simples et Doubles : Gérer les guillemets simples (') et doubles (") pour empêcher ou permettre l'interprétation des métacaractères.
|
||
|
||
Redirections :
|
||
|
||
Entrée (<) : Rediriger l'entrée standard depuis un fichier.
|
||
|
||
**Sortie (>) : Rediriger la sortie standard vers un fichier, en écrasant le contenu existant.
|
||
|
||
**Append (>>) : Rediriger la sortie standard vers un fichier, en ajoutant au contenu existant.
|
||
|
||
**Heredoc (<<) : Lire l'entrée jusqu'à un délimiteur spécifié, sans mettre à jour l'historique.
|
||
|
||
Pipes (|) : Connecter la sortie d'une commande à l'entrée d'une autre, permettant la création de pipelines.
|
||
|
||
Variables d'Environnement : Gérer l'expansion des variables d'environnement ($VARIABLE) et de la variable $? pour le statut de sortie de la dernière commande exécutée.
|
||
|
||
Gestion des Signaux :
|
||
|
||
Ctrl+C : Afficher un nouveau prompt sur une nouvelle ligne.
|
||
|
||
Ctrl+D : Quitter le shell.
|
||
|
||
Ctrl+\ : Ne rien faire.
|
||
|
||
Built-ins à Implémenter :
|
||
|
||
echo : Avec l'option -n pour supprimer le saut de ligne final.
|
||
|
||
cd : Changer le répertoire de travail actuel.
|
||
|
||
pwd : Afficher le répertoire de travail actuel.
|
||
|
||
export : Définir des variables d'environnement.
|
||
|
||
unset : Supprimer des variables d'environnement.
|
||
|
||
env : Afficher les variables d'environnement actuelles.
|
||
|
||
exit : Quitter le shell.
|
||
|
||
🔧 Approche d'Implémentation
|
||
|
||
Lecture de l'Entrée :
|
||
|
||
Utiliser la fonction readline pour afficher le prompt et lire l'entrée de l'utilisateur.
|
||
|
||
Ajouter les commandes saisies à l'historique à l'aide de add_history.
|
||
|
||
Analyse Lexicale (Lexer) :
|
||
|
||
Diviser l'entrée en tokens pour identifier les commandes, arguments, opérateurs, etc.
|
||
|
||
Analyse Syntaxique (Parser) :
|
||
|
||
Construire une structure de données représentant la commande et ses composants, en tenant compte de la priorité des opérateurs et des parenthèses.
|
||
|
||
Expansion :
|
||
|
||
Gérer l'expansion des variables d'environnement et le traitement des guillemets.
|
||
|
||
Exécution :
|
||
|
||
Implémenter les built-ins directement dans le shell.
|
||
|
||
Pour les autres commandes, utiliser fork pour créer un processus enfant et execve pour exécuter la commande.
|
||
|
||
Gérer les redirections et les pipes en ajustant les descripteurs de fichiers à l'aide de dup2.
|
||
|
||
Gestion des Signaux :
|
||
|
||
Configurer des gestionnaires de signaux pour intercepter Ctrl+C, Ctrl+D et Ctrl+\ et appliquer le comportement approprié.
|
||
|
||
Bibliothèques Utilisées :
|
||
|
||
readline : Pour la gestion du prompt et de l’historique des commandes.
|
||
|
||
unistd.h : Pour les appels système (fork, execve, dup2).
|
||
|
||
signal.h : Pour la gestion des signaux.
|
||
|
||
stdlib.h et string.h : Pour la manipulation des chaînes et allocation dynamique.
|
||
|
||
🧪 Tests et Validation
|
||
|
||
Tests Fonctionnels :
|
||
|
||
Vérifier que chaque commande interne (cd, pwd, etc.) fonctionne correctement.
|
||
|
||
Vérifier la gestion des redirections (<, >, >>) et des pipes (|).
|
||
|
||
Vérifier l’expansion des variables ($USER, $HOME, etc.).
|
||
|
||
Assurer la bonne gestion des erreurs (commandes inconnues, fichiers inexistants, etc.).
|
||
|
||
Tests de Robustesse :
|
||
|
||
Exécuter le shell avec des entrées non valides pour observer le comportement.
|
||
Tester la gestion des signaux (Ctrl+C, Ctrl+D) pour éviter les comportements indésirables.
|
||
Vérifier la gestion de la mémoire avec valgrind pour éviter les fuites.
|
||
|
||
Tests de Performance :
|
||
|
||
Exécuter un grand nombre de commandes en boucle pour évaluer la stabilité.
|
||
Tester l’exécution simultanée de plusieurs processus avec des pipes.
|
||
|
||
📚 Ressources Utiles
|
||
|
||
📂 Dépôts GitHub :
|
||
|
||
[mcombeau/minishell : Une implémentation complète avec explications.][https://github.com/mcombeau/minishell]
|
||
|
||
[tjensen42/42-minishell : Version alternative mettant l’accent sur les processus.][https://github.com/tjensen42/42-minishell]
|
||
|
||
📖 Articles et Guides :
|
||
|
||
[Minishell: Building a mini-bash : Explication détaillée du projet.][https://m4nnb3ll.medium.com/minishell-building-a-mini-bash-a-42-project-b55a10598218]
|
||
|
||
[42Docs - Minishell : Documentation technique avec conseils d’implémentation.][https://harm-smits.github.io/42docs/projects/minishell]
|
||
|
||
[Minishell Guide 42 Cursus : Guide complet du projet.][https://42-cursus.gitbook.io/guide/rank-03/minishell]
|
||
|
||
🎥 Tutoriels Vidéo :
|
||
|
||
[42-Minishell - YouTube Playlist : Série de vidéos sur le développement de Minishell.][https://www.youtube.com/playlist?list=PLGU1kcPKHMKj5yA0RPb5AK4QAhexmQwrW]
|
||
|
||
[Shell programming & Process management : Introduction aux shells Unix et gestion des processus.][https://www.youtube.com/watch?v=ZJFIwsL9I1Y]
|
||
|
||
🚀 Pourquoi ce projet est important ?
|
||
|
||
Le projet Minishell est un exercice clé pour comprendre comment fonctionne un shell Unix. Il permet d'acquérir des compétences avancées en gestion des processus, redirections d’entrée/sortie, gestion de la mémoire, et synchronisation des tâches. Ces compétences sont essentielles pour les développeurs systèmes, DevOps et ingénieurs en logiciels bas niveau. 🔥 |