Projet système · C · Epitech
42sh
Un shell Unix recodé from scratch en C, qui reproduit le comportement de tcsh. Le projet où l'on apprend vraiment comment marche un terminal.
mahir@epitech: ~/projects/42sh — 42sh
➜ ~/projects/42sh ./42sh 42sh$ ls | grep .c main.c parser.c exec.c builtins.c env.c 42sh$ echo $USER lance $0 mahir lance ./42sh 42sh$ history | tail -2 1 make 2 ./42sh 42sh$
Le projet
42sh est un projet système d'Epitech : réécrire un shell complet en C, proche de tcsh. Pas un wrapper, pas un toy : un vrai interpréteur de ligne de commande, du parsing jusqu'à l'exécution des processus.
C'est le projet qui apprend à ne plus avoir peur du bas niveau : gestion mémoire, fork/execvp, descripteurs de fichiers, signaux, et les bugs vicieux qui vont avec.
Ce qu'il gère
- pipes
- Chaînage de commandes : la sortie de l'une devient l'entrée de la suivante (cmd1 | cmd2).
- redirections
- Entrées/sorties redirigées vers des fichiers (>, >>, <, <<).
- env
- Gestion des variables d'environnement : setenv, unsetenv, expansion de $VAR.
- history
- Historique des commandes, navigable et rejouable.
- globbing
- Expansion des motifs de fichiers (*, ?, [...]) avant exécution.
- builtins
- Commandes intégrées : cd, echo, exit, env, et compagnie.
- separators
- Séquences de commandes avec ; et combinaisons logiques.
Démo
42sh.mp4 — démonstration
Installation
bash
# Cloner, compiler, lancer $ git clone git@github.com:EpitechPromo2028/B-PSU-200-42sh.git $ cd 42sh && make $ ./42sh
Commandes
- cd [dir]
- Change de répertoire courant
- setenv VAR=value
- Définit une variable d'environnement
- unsetenv VAR
- Supprime une variable d'environnement
- cmd1 | cmd2
- Redirige la sortie de cmd1 vers cmd2
- cmd1 ; cmd2
- Exécute cmd1 puis cmd2
- history
- Affiche l'historique des commandes