Entrée
Chaîne avec -c, fichier de script ou entrée standard.
Un interpréteur de commandes écrit en C, capable d'analyser une partie du langage shell et d'en exécuter les structures à partir d'un arbre syntaxique.
Un shell est le programme qui reçoit une commande dans un terminal, comprend sa structure puis lance les programmes demandés.
42sh reproduit ce parcours sans déléguer l'analyse à un shell existant. Le rendu lit une chaîne, un fichier ou l'entrée standard, découpe le texte en éléments syntaxiques, construit un arbre puis parcourt cet arbre pour exécuter les commandes et les structures reconnues.
Le sujet complet était organisé en quatre étapes. La copie conservée couvre les fondations des deux premières et quelques éléments de la troisième ; elle n'est donc pas présentée comme un shell POSIX complet.
Le programme sépare l'analyse du langage et son exécution. Cette organisation permet de vérifier la syntaxe avant de lancer une commande et de représenter les blocs imbriqués sous une forme commune.
Chaîne avec -c, fichier de script ou entrée standard.
Découpe le texte en mots, opérateurs, redirections et mots réservés.
Contrôle l'ordre des éléments et reconnaît les règles de grammaire.
Représente commandes, listes, conditions, boucles et redirections.
Lance les commandes intégrées ou un programme externe avec execvp.
L'option --pretty-print peut écrire l'AST au format DOT afin
de visualiser la structure reconnue sans l'exécuter.
Commandes simples et listes, conditions if,
elif et else, boucles while,
until et for, ainsi que blocs entre accolades.
Guillemets simples ou doubles, échappement, commentaires, affectations,
variables utilisateur et paramètres spéciaux comme $? ou
$$.
Opérateurs &&, || et !,
redirections de fichiers et de descripteurs, codes de retour et
lancement de programmes externes.
Implémentations dédiées de true, false,
echo, cd et exit afin de conserver
l'état propre au shell lorsque nécessaire.
Les 25 fichiers C compilent avec -Wall, -Wextra,
-Werror, -Wvla et -pedantic.
Lors de l'audit local, la testsuite fournie valide les 80 cas de l'étape 1 et 74 des 75 cas de l'étape 2 face à Bash en mode POSIX.
Les fonctions shell, les sous-shells, la substitution de commandes,
case, les alias et les builtins export,
unset, break et continue ne sont pas
implémentés dans cette copie. La syntaxe des pipelines est reconnue,
mais le transfert de données entre processus n'y est pas finalisé.
Le rendu assemble un lexer, un parser récursif, plusieurs types de nœuds AST, leur libération et leur évaluation. Il relie cette chaîne à la gestion des variables, des descripteurs de fichiers, des commandes intégrées et des processus externes.
Ce projet m'a donné une vue concrète du fonctionnement d'un interpréteur et de son lien avec Unix. J'y ai travaillé la grammaire d'un langage, les arbres syntaxiques, les processus, les codes de retour et la gestion rigoureuse des ressources en C.