Systèmes2025Terminé
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   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       */
/*                                                                            */
/* ************************************************************************** */
Created : ouverture du dépôt · Updated : dernier commit

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.

Cfork / execvePipesSignauxParsing
~160 Ko
C
7
builtins
binôme
équipe
Comment ça marche

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.

Le pipeline d'un shelldémo interactive
Ligne saisiereadlineLexerjetonsExpansion$VAR · $? · quotesExécutionfork · execve · pipesBuiltinscd · export · exitRedirections< > >> heredoc

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.

En bref
  • 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
Le point dur

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.