Recréer un Shell basique inspiré de Bash.
MiniShell est un projet visant à recréer un shell minimaliste, similaire à Bash, mais avec des fonctionnalités limitées. Il permet d'exécuter des commands, de gérer des variables d'environnement et de rediriger les stdin/stdout .
- ✅ Parsing des
commands: Analyse et segmentation des entrées utilisateur. - ✅ Gestion des variables d'environnement :
Expandautomatique des variables comme$USER$?$HOME$PATH... si necessaire. - ✅ Redirection de fichiers : Prise en charge des redirections (
infile,outfile,append,here_doc). - ✅ Exécution des
commands: Lancement des processus système et executions et redirection des commandes. - ✅ Gestion des erreurs : Vérification et signalement des erreurs syntaxiques, de commandes, fd, nom de fichiers ...
Pour comparer les résultats entre Bash et MiniShell :
- Lancer Bash en mode POSIX :
bash --posix
- Dans un autre terminal, lancer MiniShell et comparer le résultat des commandes.
Pour vérifier la gestion de la mémoire, utilisez Valgrind.
📝 Créer un fichier readline.supp pour ignorer les leaks de mémoire de readline :
{
ignore_readline_leaks
Memcheck:Leak
...
fun:readline
}
{
ignore_rl_history_leaks
Memcheck:Leak
...
fun:add_history
}
Exécuter MiniShell avec Valgrind :
valgrind --leak-check=full --show-leak-kinds=all --suppressions=readline.supp --track-fds=yes ./minishellLe projet repose sur plusieurs structures de données principales :
t_data: Stocke l'environnementenvsous forme de liste chaînée (key, value) ainsi que les commandest_cmd, les tokenst_tokenet le code de retour d'erreurt_status.t_token: Contient l'input de l'utilisateur en cours de decoupage (only parsing).t_cmd: Représente unecommandavec ses arguments en liste chainee et ses redirections (infile,outfile,append,here_doc).t_status: Enum (int) définissant les codes d'erreur possibles.
Le parsing d'une command suit plusieurs étapes :
- Collecte de l'input : Lecture de la ligne avec
readline. - Vérification de la syntaxe : Détection des erreurs (ex.
ls | | grep... invalide). - Découpage : Séparation en
tokens(string,type,redir). Expanddes variables : Remplacement des$VARpar sa valeur réelle dans l'environnement si elle existe.- Traitement des
quotes: Gestion des"double quotes"et'single quotes'. - Gestion des redirections : Identification et stockage des redirections (
infile,outfile,append,here_doc) dans lest_cmdassocies.
graph TD;
A[Collecte de l'input] --> B[Validation de la syntaxe]
B -->|OK| C[Découpage en tokens]
B -->|Erreur| X[Afficher un message d'erreur]
C --> D[Expand des variables]
D --> E[Gestion des quotes]
E --> F[Identification des redirections]
F --> G[Création de la structure de commandes]
G --> H[Exécution de la commande]
ls -lls > a👉 Redirige la sortie standard de ls vers a.
echo "Utilisateur : $USER"👉 Affiche Utilisateur : <nom> en remplaçant $USER.
echo "Il a dit 'Bonjour'"👉 Affiche Il a dit 'Bonjour' en conservant les quotes internes.
grep "test" < infile >> outfile👉 Recherche "test" dans infile et ajoute le résultat à outfile.
ls -l | grep "test"👉 Liste les fichiers et filtre ceux contenant "test".
cat << EOF
Hello, World!
EOF👉 Écrit "Hello, World!" dans le stdin de cat.
✨ Force a nous mon frere on va reussir ⭐
// FUNCT EXEC
// LANCER UN PIPE // SI CMD A UNE REDIRECTION OUT / APPEND ALORS REDIRIGER LA REDIR SUR STDOUT // SI CMD A UNE REDIRECTION IN / HERE_DOC ALORS REDIRIGER LA REDIR SUR STDIN // SI CMD A UN NEXT ET PAS DE REDIR OUT ALORS REDIRIGER LE PIPE[1] SUR STDOUT // SI CMD A UN NEXT ET PAS DE REDIR IN ALORS REDIRIGER LE PIPE[0] SUR STDIN APRES AVOIR EXECUTER COMMANDE (DANS PROCESS PARENT / APRES BUILTIN) // SI CMD == BUILTIN -> EXECBUILTIN // SI CMD != BUILTIN -> FORK ET EXECUTER CMD