Skip to content

faoriol/minishell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

136 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MiniShell

MiniShell Logo

Recréer un Shell basique inspiré de Bash.

📜 Description

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 .

🧑‍💻 Fonctionnalités

  • Parsing des commands : Analyse et segmentation des entrées utilisateur.
  • Gestion des variables d'environnement : Expand automatique 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 ...

🚀 Lancer MiniShell

📌 Comparaison avec Bash

Pour comparer les résultats entre Bash et MiniShell :

  1. Lancer Bash en mode POSIX :
    bash --posix
  2. Dans un autre terminal, lancer MiniShell et comparer le résultat des commandes.

📌 Lancer MiniShell avec Valgrind

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 ./minishell

📂 Structure du Projet

Le projet repose sur plusieurs structures de données principales :

  • t_data : Stocke l'environnement env sous forme de liste chaînée (key, value) ainsi que les commandes t_cmd, les tokens t_token et le code de retour d'erreur t_status.
  • t_token : Contient l'input de l'utilisateur en cours de decoupage (only parsing).
  • t_cmd : Représente une command avec ses arguments en liste chainee et ses redirections (infile, outfile, append, here_doc).
  • t_status : Enum (int) définissant les codes d'erreur possibles.

🛠️ Parsing des commands

Le parsing d'une command suit plusieurs étapes :

  1. Collecte de l'input : Lecture de la ligne avec readline.
  2. Vérification de la syntaxe : Détection des erreurs (ex. ls | | grep ... invalide).
  3. Découpage : Séparation en tokens (string, type, redir).
  4. Expand des variables : Remplacement des $VAR par sa valeur réelle dans l'environnement si elle existe.
  5. Traitement des quotes : Gestion des "double quotes" et 'single quotes'.
  6. Gestion des redirections : Identification et stockage des redirections (infile, outfile, append, here_doc) dans les t_cmd associes.

📊 Diagramme du Parsing

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]
Loading

📌 Exemples de parsing

🔹 Exemple 1 : Command simple

ls -l

🔹 Exemple 2 : Command avec redirection

ls > a

👉 Redirige la sortie standard de ls vers a.

🔹 Exemple 3 : Expand des variables d'environnement

echo "Utilisateur : $USER"

👉 Affiche Utilisateur : <nom> en remplaçant $USER.

🔹 Exemple 4 : Gestion des quotes

echo "Il a dit 'Bonjour'"

👉 Affiche Il a dit 'Bonjour' en conservant les quotes internes.

🔹 Exemple 5 : Redirections complexes

grep "test" < infile >> outfile

👉 Recherche "test" dans infile et ajoute le résultat à outfile.

🔹 Exemple 6 : Pipe entre deux commands

ls -l | grep "test"

👉 Liste les fichiers et filtre ceux contenant "test".

🔹 Exemple 7 : Here_doc pour une entrée interactive

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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors