mirror of
https://github.com/Ladebeze66/devsite.git
synced 2026-03-27 18:03:46 +01:00
154 lines
6.0 KiB
Markdown
154 lines
6.0 KiB
Markdown
# minishell
|
||
|
||
**Slug :** `minishell`
|
||
**Lien GitHub :** [https://github.com/Ladebeze66/minishell](https://github.com/Ladebeze66/minishell)
|
||
|
||
---
|
||
|
||
## Description
|
||
|
||
Le projet Minishell de l'école 42 consiste à coder un interpréteur de commandes minimaliste, inspiré de bash. Il permet d’exécuter des commandes via un prompt interactif, en gérant les processus, les pipes (|), les redirections (<, >, >>, <<), et les signaux (Ctrl+C, Ctrl+D). Il inclut aussi des built-ins (echo, cd, pwd, export, env, unset, exit). Ce projet développe des compétences essentielles en programmation système, gestion de la mémoire et manipulation des processus sous Unix.
|
||
|
||
## Détails du projet
|
||
|
||
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.
|
||
|
||
🚀 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. 🔥
|
||
|
||
## Informations techniques
|
||
|
||
- **Langage principal :** C
|
||
- **École :** 42 Perpignan
|
||
- **Type :** Projet pédagogique
|
||
- **Illustrations :** 8 images disponibles
|