Skip to content

ugozchi/42_Minishell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Minishell logo

Grade badge Language Badge Norminette BadgeLibrary Badge

Minishell 👩🏼‍💻

Ce projet, développé dans le cadre de la formation à l'École 42, consiste en la création d'un shell simplifié en langage C, inspiré des fonctionnalités de Bash. L'objectif est de comprendre et d'implémenter les mécanismes fondamentaux d'un interpréteur de commandes Unix, en manipulant les processus, les redirections, les pipes et les signaux.

Objectifs Le projet Minishell permet de renforcer les compétences en programmation système en abordant des concepts avancés comme :

  • La gestion des processus : exécuter des commandes et manipuler les processus enfants.
  • La redirection des entrées/sorties (I/O) : permettre les redirections standard >, >>, < et <<.
  • La gestion des pipes (|) : enchaîner des commandes avec une communication entre elles.
  • Les signaux : gérer l'interruption du programme avec des signaux comme Ctrl+C, Ctrl+D, etc.

Voici le sujet.

Télécharge et test ⬇️

Clone le projet.

git clone https://github.com/ugozchi/42_Minishell.git
cd 42_Minishell

Options possibles ⚙️

Ici, vous pouvez utiliser les options classiques d'un Makefile (options ci-dessous) mais aussi l'option bonus qui vous permettra d'ajouter vos fonctions bonus dans votre fichier archive libft.a si vous les avez fait.
Toute cette partie correspond à ce que l'on doit rendre pour ce faire corriger.


Option Description
make Créer un fichier archive libftpritnf.a avec tous les fichiers
make clean Supprime le dossier contenant les fichiers objets .o
make fclean Execute clean puis supprime le fichier archive .a
make re Execute fclean puis make

Explication de la structure 🏰

Minishell est construit autour de plusieurs modules principaux qui interagissent pour exécuter les commandes de l'utilisateur. Voici un aperçu des principales structures et fichiers :

1) Gestion des entrées et parsing

  • lexer.c : Analyse la ligne de commande saisie par l'utilisateur et la découpe en tokens (arguments, redirections, opérateurs...)

  • parser.c : Organise les tokens en une structure syntaxique exploitable, prenant en compte les priorités des opérateurs.

  • expander.c : Gère les variables d'environnement ($HOME, $USER...), l'expansion des jokers (*), et les substitutions.


2) Gestion des processus et exécution

  • executor.c : Exécute les commandes en tenant compte des redirections et des pipes.

  • builtin.c : Implémente les commandes internes comme cd, echo, exit, env, unset...

  • redirect.c : Gère les redirections (>, >>, <, <<) et assigne les descripteurs de fichier appropriés.

  • pipe.c : Gère la communication entre plusieurs processus en enchaînant des commandes via |.


3) Gestion des signaux

  • signals.c : Capture et gère les signaux système comme CTRL+C, CTRL+Z, CTRL+D pour permettre un comportement interactif du shell.

  • handler.c : Définit le comportement du shell face aux interruptions utilisateur.


4) Gestion de l'environnement et mémoire

  • env.c : Gère la liste des variables d'environnement et leur modification avec export et unset.

  • memory.c : Assure la libération correcte de la mémoire pour éviter les fuites (free_all, clear_tokens...).


Organisation du code 🔧

1️⃣ Initialisation et Gestion de l'Environnement

  • init_env.c : Charge les variables d'environnement et ajuste SHLVL.

  • init.c : Initialise t_data, stocke les chemins d'exécution et configure les entrées/sorties.

  • get_env_export.c : Récupère les variables d'environnement pour export et les ajuste si nécessaire.


2️⃣ Analyse Lexicale et Parsing

  • lexer_main.c : Analyse la ligne de commande en tokens exploitables.

  • lexer_define_tokens.c : Identifie le type des tokens (commandes, arguments, redirections, etc.).

  • lexer_quotes.c : Gère les guillemets pour éviter les erreurs de parsing.

  • expander_main.c : Gère l'expansion des variables ($USER, $PWD) et le remplacement des valeurs.

  • parser_main.c : Organise les tokens en une structure syntaxique permettant l'exécution correcte.

  • parser_command_populate.c : Associe les arguments et flags aux commandes.


3️⃣ Gestion des Redirections et Pipes

  • redirect.c : Gère les redirections (>, >>, <, <<) en ouvrant et fermant les fichiers nécessaires.

  • pipes_builder.c : Crée et gère les pipes pour la communication entre processus.

  • pipeline_execute.c : Exécute les commandes enchaînées avec | et redirige les entrées/sorties.


4️⃣ Exécution des Commandes

  • executer_main.c : Coordonne l'exécution des commandes internes et externes.

  • command_executer.c : Recherche le chemin des commandes et les exécute avec execve.

  • fd_manager.c : Gère l'ouverture et la fermeture des fichiers lors de l'exécution.


5️⃣ Gestion des Signaux et du Contrôle du Shell

  • signals.c : Capture CTRL+C, CTRL+Z, CTRL+D et ajuste le comportement du shell.

  • signals_here_doc.c : Gère les interruptions pour heredoc.


6️⃣ Implémentation des Builtins

  • builtin.c : Contient les commandes internes (cd, exit, env, unset, export,..).

  • echo.c : Gère l'affichage de chaînes avec l'option -n.

  • cd.c : Implémente la navigation dans les répertoires avec chdir().

  • export.c et unset.c : Modifient les variables d'environnement.


7️⃣ Nettoyage et Libération de Mémoire

  • free_mem_btw_cmd.c : Nettoie la mémoire entre chaque commande pour éviter les fuites.

  • free_all.c : Libère toutes les ressources utilisées par le shell avant de quitter.


Note Final et Commentaires 📔


Correcteur 1
Correcteur 2
Correcteur 3

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published