/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* main.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: zamohame <zamohame@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/07/21 08:35:08 by lkantzer #+# #+# */ /* Updated: 2025/08/13 21:13:00 by lkantzer ### ########.fr */ /* */ /* ************************************************************************** */
minishell
Réécrire bash, ou du moins ce qui compte
Un shell Unix écrit en binôme : lexer, guillemets, expansion, pipes, redirections, heredocs et builtins.
- ~160 Ko
- C
- 7
- builtins
- binôme
- équipe
Les règles du langage
Un shell n'exécute pas la ligne qu'on tape : il la transforme d'abord. Ces règles de transformation sont tout le projet.
- '…'
- Entre guillemets simples, plus rien ne s'interprète : le dollar, l'espace et le guillemet double y sont des caractères comme les autres.
- "…"
- Entre guillemets doubles, les variables s'expansent, mais le résultat reste un seul mot — espaces compris.
- $VAR · $?
- Une variable est remplacée par sa valeur, ou par rien si elle n'existe pas. $? porte le code de retour de la dernière commande.
- |
- La sortie de gauche devient l'entrée de droite. Chaque maillon tourne dans son propre processus, et tous sont lancés avant qu'on attende le premier.
- < > >> <<
- Entrée depuis un fichier, sortie écrasée, sortie ajoutée, et heredoc — qui lit l'entrée jusqu'à un délimiteur avant même de lancer la commande.
L'ordre des étapes compte autant que les règles : on découpe en jetons, puis on expanse, puis on redécoupe ce qui doit l'être. Inverser deux étapes, et une variable vide ne se comporte plus comme dans bash.
Les builtins
Sept commandes ne sont pas des programmes : elles modifient le shell lui-même, ce qu'un processus fils ne saurait pas faire — il mourrait avec son changement.
- cd
- Change le répertoire du shell. Lancé dans un fils, il n'aurait aucun effet visible.
- export · unset · env
- Ajoutent, retirent et listent les variables d'environnement, tenues en liste chaînée plutôt qu'en tableau figé.
- echo · pwd
- Écrivent sur la sortie, avec l'option -n pour le premier.
- exit
- Termine le shell avec le code demandé.
Dans un pipe, en revanche, un builtin tourne bien dans un fils et perd son effet — bash fait exactement pareil.
Rien de tout cela n'est fourni par le sujet. La difficulté réelle est dans l'expansion : une même variable s'interprète entre guillemets doubles et reste littérale entre guillemets simples, ce qui rend le découpage dépendant du contexte.
- 01Rien n'est fourni : du découpage de la ligne jusqu'à execve
- 02Sept builtins qui modifient le processus courant
- 03Environnement reconstruit en liste chaînée manipulable
- 04Découpage strict par dossiers pour avancer à deux sans se bloquer
Les guillemets changent tout
Une même variable s'expanse entre guillemets doubles et reste littérale entre guillemets simples. Le découpage dépend du contexte, ce qui interdit toute approche par simples séparateurs.