lp177
~/lp177 $ ./ft_minishellC · Make · POSIX (fork, execve)ft_minishell

ft_minishell

Un shell minimal en C : invite, recherche dans le PATH, commandes internes

Projet d'école (42)mars 2015CMakePOSIX (fork, execve)

Code source

Projet de l’école 42 (mars 2015) : un interpréteur de commandes minimal en C. Il lit une ligne, cherche l’exécutable dans le PATH, le lance avec fork et execve, et gère son propre environnement avec les commandes internes cd, env, setenv, unsetenv et exit.

But du projet

Premier projet « shell » du cursus Unix de l’école 42 (binaire ft_minishell1). Il fait manipuler les bases d’un interpréteur : création de processus avec fork, execve et wait, résolution des commandes dans le PATH, gestion des variables d’environnement et des signaux.

Fonctionnalités

  • Invite affichant le répertoire courant.
  • Exécution par chemin (/bin/ls, ./a.out) ou par recherche dans les dossiers du PATH, avec des messages distincts pour « programme introuvable » et « pas le droit d’exécution ».
  • cd : sans argument ou avec ~, utilise HOME ; met à jour PWD.
  • env : affiche l’environnement, ou lance une commande avec (env ls) ou sans environnement (env -i ls).
  • setenv CLE=valeur ou setenv CLE valeur 1 (le dernier argument autorise l’écrasement), unsetenv CLE (refusé pour PATH et PWD), exit.
  • Ctrl+C demande une confirmation avant de quitter, Ctrl+D quitte ; une ligne terminée par \ continue sur la suivante.
  • Lancé avec un environnement vide, le shell crée PWD et PATH=/bin.

Fonctionnement

L’environnement hérité (environ) est copié dans une liste doublement chaînée, accessible via un singleton, puis reconverti en tableau CLE=valeur à chaque execve. La ligne est lue par blocs de 1024 octets et découpée sur les espaces et tabulations : pas de guillemets, de tubes ni de redirections. Le projet embarque sa propre version de la libft.

Compilation

make
./ft_minishell1

Le code a été écrit pour les Mac de l’école en 2015. Sous Linux, la compilation échoue en l’état avec -Werror : wait() est utilisé sans inclure <sys/wait.h>.