Skip to content
LamizanaPublic

Latest commit

 

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

C clang readline libft Makefile Projet 42

Minishell

Interpréteur de commandes UNIX (shell) en C, inspiré de bash.

Projet de l'école 42.

Créé le 02/02/2023 · Dernière mise à jour : 29/08/2026

Fiche du projet

Sommaire

Afficher le sommaire

À propos

Minishell est une réimplémentation minimaliste d'un interpréteur de commandes UNIX (shell) écrit en C, réalisée en binôme dans le cadre du tronc commun de l'école 42. L'objectif : comprendre ce qui se passe réellement derrière un terminal, les processus, les descripteurs de fichiers, les pipes et les signaux.

Le shell lit une ligne avec readline, la parse, puis exécute la commande via fork / execve / wait, en gérant les builtins, les pipes et la redirection de sortie.

Ressource Lien
Fiche du projet (portfolio) Minishell, ZehdBox
Code source github.com/Lamizana/Minishell

Fonctionnalités

Catégorie Détail
Builtins echo (option -n), cd, pwd, export, unset, env, exit
Commandes externes Résolution via PATH (execve) et exécutables locaux ./programme
Pipes Enchaînement simple et multiple avec |
Redirection Redirection simple de sortie >
Quotes Simple '...' et double "..."
Variables Expansion $VAR et code de sortie $?
Signaux Ctrl-C interrompt la commande et réaffiche le prompt, Ctrl-\ ignoré, Ctrl-D (EOF) quitte le shell
Prompt Coloré (chemin courant) avec historique readline

Comment ça marche

Le cœur du projet est la boucle REPL (Read - Eval - Print - Loop), cycle fondamental de tout shell interactif :

  1. Read : la ligne est lue au clavier via readline(), puis ajoutée à l'historique avec add_history().
  2. Eval : la ligne est transformée par le pipeline de parsing : expansion des variables ($VAR, $?), espacement des |, découpage en arguments (le splitter ignore les séparateurs entre quotes) et nettoyage des quotes résiduelles. La commande est ensuite exécutée.
  3. Print : la sortie du programme est écrite sur la sortie standard (dup2 vers STDOUT_FILENO).
  4. Loop : le shell libère la mémoire, réaffiche le prompt et attend la saisie suivante, jusqu'à exit ou Ctrl-D.
   saisie utilisateur
         │
         ▼
   readline() + add_history()
         │
         ▼
   parsing  ──►  $VAR / $?  ──►  découpage (pipes, quotes)
         │
         ▼
   fork() ─► execve() ─► wait()      (commande simple)
         │
         └─► pipes : dup2() relie la sortie d'un enfant à l'entrée du suivant

Note

Le projet se limite volontairement au périmètre du sujet : la redirection de sortie > est gérée, mais >>, < et les heredocs ne sont pas implémentés.


Installation

Prérequis

  • Un compilateur C (clang recommandé)
  • La bibliothèque readline (en-têtes de développement)
  • make
  • Linux / macOS

Étapes

git clone https://github.com/Lamizana/Minishell.git
cd Minishell

Installation des dépendances selon le système :

# Debian / Ubuntu
sudo apt install clang libreadline-dev

# macOS (Homebrew)
brew install readline

Puis compilation :

make re

Note

Le Makefile compile libft puis l'exécutable minishell avec les drapeaux -Wall -Werror -Wextra -g et l'édition de liens à -lreadline.


Bibliothèques

Bibliothèque Rôle
libft Bibliothèque C personnelle (réimplémentation partielle de la libc), qui sert de base au projet
GNU Readline Édition de ligne interactive, historique et gestion du prompt (-lreadline)

Utilisation

./minishell

Quelques exemples une fois le prompt affiché :

minishell$ echo "hello" | tr a-z A-Z
minishell$ ls -l > out.txt
minishell$ export NAME=42 && echo $NAME
minishell$ cd /tmp && pwd
minishell$ ./minishell         # lancement d'un exécutable local

Tip

L'historique est actif : utilisez les flèches ↑/↓ pour naviguer dans les commandes précédentes.


Structure du projet

Minishell/
├── libft/               # bibliothèque C personnelle (réimplémentation partielle de la libc)
├── minishell_tester/    # suite de tests (scripts + cas de test)
├── utils/               # documents annexes (sujets PDF, palette de couleurs)
├── *.c                  # sources : parsing, builtins, pipes, redirections, execve
├── minishell.h          # en-têtes, structures et prototypes
├── Makefile             # build : all / clean / fclean / re
├── NOTES.md             # notes d'étude (fonctions autorisées, appels système)
├── vsupp                # fichier de suppressions Valgrind (fuites de readline)
└── README.md

Tests

Vérification des fuites mémoire avec Valgrind et le fichier de suppressions :

valgrind --leak-check=full --show-leak-kinds=all --suppressions=vsupp ./minishell

Note

readline génère environ 215 blocs non libérés (comportement connu de la bibliothèque), neutralisés via le fichier de suppressions vsupp.


Documentation

Fichier Descriptif
NOTES.md Notes d'étude : fonctions autorisées, appels système et réflexion sur le projet
minishell_tester/ Suite de tests du shell (builtins, pipes, redirections, etc.)

Contribuer

Projet pédagogique 42 : les corrections et les remarques sont bienvenues via une issue ou une pull request.

Les messages de commit suivent Conventional Commits :

<type>(<scope>): <description>
Type Usage
feat Nouvelle fonctionnalité
fix Correction de bug
docs Documentation seule
refactor Réécriture sans changement de comportement
chore Maintenance (configuration, fichiers annexes)

Scopes : parsing, builtins, exec, pipes, readline, readme, deps.


Auteur

Alex Lamizana, étudiant à 42 Angoulême, spécialisation Data & IA (projet réalisé en binôme avec vsaura)


Remerciements

  • 42 Angoulême : cadre pédagogique du projet
  • Valgrind : outil de vérification mémoire utilisé pour les tests

Ce projet a été réalisé conformément à la norme et au sujet officiel de 42.