Mètodes

42 (IX): minishell, un terminal des de zero

Recrear bash: parser, pipes, redireccions, variables d'entorn. El projecte més gran fins ara, amb entorn MSX net per avaluar.

42 (IX): minishell, un terminal des de zero

El projecte que més respecte guanya a 42, sense discusió: recrear una shell. Quan acabes, cada vegada que escrius un pipeline al terminal mires la pantalla amb uns altres ulls. Aquesta és la història del meu minishell, que va acabar tenint personalitat pròpia: estil MSX BASIC.

Què demanava el projecte

Recrear una part de bash en C: un prompt que llegeix ordres, un parser que les converteix en alguna cosa executable, un executor que engega binaris externs i els builtins propis (cd, echo, export, unset, env, pwd, exit), pipes, redireccions, variables d’entorn, i gestionar les senyals com toca. Sense banners ni floritures: si el parsing falla, la shell no ha de morir mai.

L’arquitectura que vaig fer servir

Vaig separar el projecte en capes clares: parser, executor, builtins, entorn, bucle principal i senyals, cada cosa amb el seu mòdul. Quan el camí entre l’entrada i l’execució d’una ordre passa per tantes mans, saber on viu cada cosa és la diferència entre avançar i tornar-se boig. El repositori final té la documentació completa per mòduls, i encara la faig servir com a referència.

Els tres obstacles que recordo

Les cometes i l’expansió. El parser s’ho empassava tot bé fins que algú escrivia echo "" "" i una ordre perduda pel camí desapareixia. Em va costar un debugging sencer entendre que l’expansió buida és un cas propi, no una excepció.

Ctrl+C. Que la shell ignori la interrupció però els processos fills la rebin és una dansa de senyals que vaig tenir que reescriure més d’una vegada. El commit “fix ctrl+c” és dels que més satisfacció em va donar.

El “still reachable”. Valgrind sortia net però amb una coleta: memòria encara accessible. Tècnicament ningú no t’obliga a alliberar-la, però vaig obrir una branca específica per deixar el rastre completament net. Va ser una feina gairebé terapèutica: tancar totes les portes per on es podria escapar res.

El detall que el fa meu

La presentació amb l’entorn net va coincidir amb una manera pròpia de fer les coses: el prompt i els missatges seguint l’estil del MSX BASIC, l’ordinador amb què vaig començar. El repositori es diu minishell_msx per una cosa: hi ha un petit homenatge dins.

Van ser més de cent commits, setmanes de proves i alguna nit llarga. Però des de llavors, quan faig ls | grep x > sortida.txt, sé exactament què passa per sota. I això no s’oblida mai més.