Le dépôt actuel comprend le fichier README du Parsing. Si vous souhaitez obtenir des informations sur l'executeur, je vous recommande de consulter le compte GitHub de mon coéquipier, accessible via ce lien : https://github.com/Jalevesq/Minishell
Le projet Minishell de l'école 42 consiste en la création d'un programme de shell simplifié en langage C. L'objectif de ce projet est de comprendre le fonctionnement d'un shell et de mettre en pratique les connaissances en manipulation de processus et en gestion de fichiers (fd).
- Parsing : réalisé par EthanPasquier
- Exécuteur & Builtins: réalisé par Jalevesq
- Lecture des commandes de l'utilisateur. (Main)
- Gestion des erreurs de saisie d'utilisateur. (Parsing)
- Lancement des exécutables (en utilisant les chemins relatifs et absolus ainsi que la variable d'environnement PATH). (Exécuteur)
- Gestion de l'historique des commandes. (Main)
- Gestion des variables d'environnement (substitution de la variable d'environnement $ par sa valeur). (Parsing)
- Implémentation des builtins (Exécuteur) :
- echo avec l'option -n.
- cd uniquement avec un chemin relatif ou absolu.
- pwd sans aucune option.
- export sans aucune option.
- unset sans aucune option.
- env sans aucune option ni argument.
- exit sans aucune option.
- Gestion des redirections (<, >, >>, <<). (Exécuteur)
- Gestion des pipes (|). (Exécuteur)
- Gestion des signaux (ctrl-C, ctrl-D, ctrl-\). (Main)
- Support des single quotes (') qui empêchent l'interprétation des méta-caractères dans la séquence entre guillemets. (Parsing)
- Support des double quotes (") qui empêchent l'interprétation des méta-caractères dans la séquence entre guillemets sauf pour le signe dollar $. (Parsing)
- Support de la substitution de $? par le statut de sortie de la dernière commande exécutée au premier plan. (Parsing)
-
Cloner le dépôt :
git clone https://github.com/EthanPasquier/minishell.git
-
Compiler le programme (le Makefile télécharge automatiquement la librairie Readline nécessaire pour le bon fonctionnement du programme) :
make
*Note : Veuillez noter que le téléchargement et la compilation de la librairie Readline peuvent prendre un certain temps, en fonction de votre connexion internet et des performances de votre ordinateur. Si vous rencontrez des problèmes lors du téléchargement ou de la compilation, vous pouvez réessayer en exécutant à nouveau la commande make ou make re.
-
Lancer le shell :
./minishell
-
Utiliser le shell en tapant des commandes standard ou en utilisant les fonctionnalités spécifiques.
Le programme se décompose en plusieurs fichiers source :
.
├── include
├── libft
├── srcs
│ ├── built
│ ├── exec
│ ├── main
│ ├── parsing
│ └── tools
└── Makefile
Pour comprendre l'executeur : https://github.com/Jalevesq/Minishell
Dans ce fichier README, nous expliquerons la partie Parsing du projet MiniShell de l'école 42.
-
Le parsing commence avec la fonction
ft_parser
, qui prend en paramètre unchar *str
correspondant à la commande de l'utilisateur. -
On vérifie que la commande ne commence ni ne finit par des caractères indésirables ou impossibles.
-
La fonction
ft_write_cut
place des caractères 29 (caractères invisibles et itérables) pour pouvoir ensuite diviser les caractères et les mettre dans une liste chaînée. Cela permet de vérifier chaque commande une par une.- Exemple :
ls -lah | wc > test
deviendrals -lah29|29 wc 29>29 test
.
- Exemple :
-
Une liste chaînée nommée
token
est créée et assignera chaque type à un numéro à la fin du parsing pour faciliter l'exécution. -
La fonction
ft_parser_suite
(suite deft_parser
) est utilisée, car la norme de l'école 42 est stricte et exige moins de 25 lignes par fonction. -
Dans cette fonction, une boucle vérifie chaque nœud de la liste chaînée. On vérifie si le nombre de guillemets (
"
et'
) est pair et s'ils sont dans un ordre possible.- Exemple :
echo "'salut"'
ne fonctionne pas, maisecho "'salut'"
fonctionne.
- Exemple :
-
Si les conditions ne sont pas remplies, un message d'erreur est affiché et un code d'erreur est renvoyé pour le
$?
. -
La fonction
ft_guillemet
supprime tous les guillemets qui ne doivent pas être affichés dans le shell. Elle gère également l'affichage des variables d'environnement si nécessaire, commeecho "$USER"
qui devientecho "epasquie"
. -
L'option
-n
deecho
est traitée pour transformer l'entrée (par exemple,echo -nnn -nnnn -n test
enecho -n test
). -
On vérifie si l'export a été bien formaté s'il y en a un.
-
Dans
ft_setup_node
, on s'occupe de la syntaxe| >
. Dansft_write_cut
, elle est notée| >
, mais pour l'exécution, il faut la formater de manière à ce que|
reste dans le nœud actuel et>
soit décalé dans un nouveau nœud, décalant ainsi tous les nœuds après le|
. -
Après avoir effectué toutes les vérifications et modifications dans le parsing, on est presque sûr que la syntaxe de la commande est correcte. On peut assigner chaque type à son nombre grâce à la fonction
ft_assign_type
. -
On envoie notre liste chaînée avec nos commandes et la liste chaînée des types dans l'exécuteur qui s'occupera du reste.
Minishell est un projet intéressant pour se familiariser avec la programmation en C et la manipulation de processus. Il est également utile pour comprendre le fonctionnement d'un shell et les fonctionnalités de base telles que l'environnement système, les redirections et les pipes.