docs: enhance README with detailed Unix shell implementation guide
This commit is contained in:
parent
df04c2fecc
commit
3df8bfa8a8
279
README.md
279
README.md
@ -1 +1,278 @@
|
||||
101%
|
||||
# Minishell - École 42
|
||||
|
||||
## Description
|
||||
Minishell est un projet de l'École 42 qui consiste à créer un shell Unix minimaliste mais fonctionnel, similaire à bash. Ce projet permet de comprendre en profondeur le fonctionnement des shells, la gestion des processus, et l'exécution de commandes sous Unix.
|
||||
|
||||
## Objectifs pédagogiques
|
||||
- Maîtriser la **programmation système** Unix/Linux
|
||||
- Comprendre l'**exécution de processus** (fork, exec, wait)
|
||||
- Gérer les **pipes et redirections** d'I/O
|
||||
- Implémenter un **parser** pour analyser les commandes
|
||||
- Traiter les **signaux système** (SIGINT, SIGQUIT)
|
||||
- Gérer les **variables d'environnement**
|
||||
|
||||
## Fonctionnalités implémentées
|
||||
|
||||
### Built-ins
|
||||
- `echo` avec option `-n`
|
||||
- `cd` avec chemins relatifs et absolus
|
||||
- `pwd` - affichage du répertoire courant
|
||||
- `export` - définition de variables d'environnement
|
||||
- `unset` - suppression de variables
|
||||
- `env` - affichage de l'environnement
|
||||
- `exit` - fermeture du shell avec code de retour
|
||||
|
||||
### Fonctionnalités shell
|
||||
- **Exécution de programmes** via PATH ou chemin absolu
|
||||
- **Pipes** (`|`) pour chaîner les commandes
|
||||
- **Redirections** :
|
||||
- `<` redirection d'entrée
|
||||
- `>` redirection de sortie
|
||||
- `>>` redirection de sortie en mode append
|
||||
- `<<` here document avec délimiteur
|
||||
- **Variables d'environnement** (`$VAR`, `$?`, `$$`)
|
||||
- **Gestion des quotes** simples et doubles
|
||||
- **Historique** des commandes
|
||||
- **Autocomplétion** basique
|
||||
|
||||
### Gestion des signaux
|
||||
- `Ctrl+C` (SIGINT) - interruption
|
||||
- `Ctrl+D` (EOF) - fermeture propre
|
||||
- `Ctrl+\` (SIGQUIT) - ignoré en mode interactif
|
||||
|
||||
## Technologies utilisées
|
||||
- **Langage** : C (norme 42)
|
||||
- **Bibliothèques** : readline, termcap
|
||||
- **Appels système** : fork, execve, wait, pipe, dup2
|
||||
- **Gestion mémoire** : malloc, free (pas de leaks)
|
||||
|
||||
## Architecture du projet
|
||||
|
||||
### Structure des fichiers
|
||||
```
|
||||
Minishell/
|
||||
├── Makefile # Compilation
|
||||
├── includes/ # Headers (.h)
|
||||
│ ├── minishell.h # Header principal
|
||||
│ └── libft.h # Bibliothèque libft
|
||||
├── srcs/ # Code source
|
||||
│ ├── main.c # Point d'entrée
|
||||
│ ├── parsing/ # Analyseur lexical/syntaxique
|
||||
│ │ ├── lexer.c
|
||||
│ │ ├── parser.c
|
||||
│ │ └── expander.c
|
||||
│ ├── execution/ # Exécution des commandes
|
||||
│ │ ├── executor.c
|
||||
│ │ ├── pipes.c
|
||||
│ │ └── redirections.c
|
||||
│ ├── builtins/ # Commandes intégrées
|
||||
│ │ ├── echo.c
|
||||
│ │ ├── cd.c
|
||||
│ │ ├── pwd.c
|
||||
│ │ ├── export.c
|
||||
│ │ ├── unset.c
|
||||
│ │ ├── env.c
|
||||
│ │ └── exit.c
|
||||
│ ├── signals/ # Gestion des signaux
|
||||
│ │ └── signals.c
|
||||
│ └── utils/ # Fonctions utilitaires
|
||||
│ ├── env_utils.c
|
||||
│ ├── error.c
|
||||
│ └── cleanup.c
|
||||
└── libft/ # Bibliothèque personnelle
|
||||
```
|
||||
|
||||
### Flux d'exécution
|
||||
1. **Lecture** de la ligne de commande (readline)
|
||||
2. **Tokenisation** et analyse lexicale
|
||||
3. **Parsing** et construction de l'AST
|
||||
4. **Expansion** des variables et wildcards
|
||||
5. **Exécution** avec gestion des processus
|
||||
6. **Nettoyage** mémoire et gestion d'erreurs
|
||||
|
||||
## Installation et compilation
|
||||
|
||||
### Prérequis
|
||||
- **GCC** compiler
|
||||
- **Make**
|
||||
- **Bibliothèque readline** (`sudo apt-get install libreadline-dev`)
|
||||
|
||||
### Compilation
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd Minishell
|
||||
make
|
||||
```
|
||||
|
||||
### Nettoyage
|
||||
```bash
|
||||
make clean # Supprime les fichiers .o
|
||||
make fclean # Supprime tout + l'exécutable
|
||||
make re # Recompile entièrement
|
||||
```
|
||||
|
||||
## Utilisation
|
||||
|
||||
### Lancement
|
||||
```bash
|
||||
./minishell
|
||||
```
|
||||
|
||||
### Exemples de commandes
|
||||
```bash
|
||||
# Commandes simples
|
||||
$ ls -la
|
||||
$ pwd
|
||||
$ echo "Hello World"
|
||||
|
||||
# Pipes
|
||||
$ cat file.txt | grep "pattern" | wc -l
|
||||
$ ls | head -5
|
||||
|
||||
# Redirections
|
||||
$ echo "test" > output.txt
|
||||
$ cat < input.txt
|
||||
$ ls >> log.txt
|
||||
|
||||
# Here document
|
||||
$ cat << EOF
|
||||
> line 1
|
||||
> line 2
|
||||
> EOF
|
||||
|
||||
# Variables d'environnement
|
||||
$ export MY_VAR="value"
|
||||
$ echo $MY_VAR
|
||||
$ echo $? # Code de retour dernière commande
|
||||
$ echo $$ # PID du shell
|
||||
|
||||
# Built-ins
|
||||
$ cd /home/user
|
||||
$ pwd
|
||||
$ env | grep PATH
|
||||
$ unset MY_VAR
|
||||
$ exit 0
|
||||
```
|
||||
|
||||
### Gestion des quotes
|
||||
```bash
|
||||
$ echo "Hello $USER" # Expansion dans les doubles quotes
|
||||
$ echo 'Hello $USER' # Pas d'expansion dans les simples quotes
|
||||
$ echo "He said 'hello'" # Imbrication de quotes
|
||||
```
|
||||
|
||||
## Gestion d'erreurs
|
||||
|
||||
### Types d'erreurs gérées
|
||||
- **Commandes introuvables** (command not found)
|
||||
- **Permissions insuffisantes** (permission denied)
|
||||
- **Fichiers inexistants** (no such file or directory)
|
||||
- **Erreurs de syntaxe** (syntax error)
|
||||
- **Erreurs de pipe** (broken pipe)
|
||||
- **Allocation mémoire** (malloc failure)
|
||||
|
||||
### Codes de retour
|
||||
- `0` - Succès
|
||||
- `1` - Erreur générale
|
||||
- `2` - Erreur de syntaxe
|
||||
- `126` - Permission refusée
|
||||
- `127` - Commande introuvable
|
||||
- `130` - Interruption par signal
|
||||
|
||||
## Parsing et analyse
|
||||
|
||||
### Étapes du parsing
|
||||
1. **Tokenisation** : Division en tokens (mots, opérateurs)
|
||||
2. **Classification** : Identification du type de chaque token
|
||||
3. **Validation syntaxique** : Vérification de la grammaire
|
||||
4. **Construction AST** : Arbre syntaxique abstrait
|
||||
5. **Expansion** : Variables, quotes, wildcards
|
||||
|
||||
### Grammaire simplifiée
|
||||
```
|
||||
command_line : pipeline
|
||||
pipeline : command ('|' command)*
|
||||
command : simple_command redirection*
|
||||
simple_command : word word*
|
||||
redirection : '<' word | '>' word | '>>' word | '<<' word
|
||||
```
|
||||
|
||||
## Gestion mémoire
|
||||
|
||||
### Stratégies appliquées
|
||||
- **Allocation tracking** : Suivi de toutes les allocations
|
||||
- **Cleanup systématique** : Libération en cas d'erreur
|
||||
- **Valgrind clean** : Aucun leak détecté
|
||||
- **Error handling** : Gestion robuste des échecs malloc
|
||||
|
||||
## Tests et validation
|
||||
|
||||
### Tests automatisés
|
||||
```bash
|
||||
# Tests de base
|
||||
make test
|
||||
|
||||
# Tests avec valgrind
|
||||
make test_memory
|
||||
|
||||
# Tests de régression
|
||||
make test_all
|
||||
```
|
||||
|
||||
### Cas de test couverts
|
||||
- Commandes simples et complexes
|
||||
- Pipes multiples
|
||||
- Redirections combinées
|
||||
- Gestion d'erreurs
|
||||
- Variables d'environnement
|
||||
- Signaux et interruptions
|
||||
|
||||
## Optimisations
|
||||
|
||||
### Performance
|
||||
- **Parser optimisé** pour les cas courants
|
||||
- **Gestion mémoire** efficace
|
||||
- **Exécution directe** des built-ins
|
||||
- **Cache PATH** pour les exécutables
|
||||
|
||||
### Compatibilité
|
||||
- **POSIX compliance** pour les fonctionnalités de base
|
||||
- **Bash-like behavior** pour l'expérience utilisateur
|
||||
- **Cross-platform** (Linux, macOS)
|
||||
|
||||
## Compétences développées
|
||||
- **Programmation système** avancée Unix/Linux
|
||||
- **Gestion des processus** et communication inter-processus
|
||||
- **Parsing** et analyse syntaxique
|
||||
- **Architecture logicielle** modulaire
|
||||
- **Debugging** multi-processus
|
||||
- **Gestion mémoire** rigoureuse sans leaks
|
||||
- **Tests** et validation de systèmes complexes
|
||||
|
||||
## Contraintes et normes 42
|
||||
- **Norme de codage** 42 strictement respectée
|
||||
- **Pas de variables globales** (sauf une pour les signaux)
|
||||
- **Gestion d'erreurs** exhaustive
|
||||
- **Pas de memory leaks** (validé Valgrind)
|
||||
- **Fonctions autorisées** uniquement celles de la liste 42
|
||||
|
||||
## Challenges techniques
|
||||
|
||||
### Difficultés rencontrées
|
||||
- **Parsing complexe** avec gestion des quotes et échappements
|
||||
- **Gestion des signaux** dans un contexte multi-processus
|
||||
- **Race conditions** entre processus père et fils
|
||||
- **Memory management** dans un contexte d'erreurs multiples
|
||||
- **Compatibilité bash** pour les edge cases
|
||||
|
||||
### Solutions apportées
|
||||
- **Architecture modulaire** facilitant la maintenance
|
||||
- **Error handling** centralisé et robuste
|
||||
- **Tests exhaustifs** couvrant les cas limites
|
||||
- **Documentation** du code pour la compréhension
|
||||
|
||||
## Auteur
|
||||
Alexandre Pommier (apommier) - École 42
|
||||
|
||||
## Licence
|
||||
Projet académique - École 42
|
||||
|
||||
Loading…
Reference in New Issue
Block a user