Minishell es un proyecto desarrollado en 42 Madrid cuyo objetivo es implementar un shell propio, simulando un pequeño Bash. Es una oportunidad para aprender sobre procesos, file descriptors, señales, y pipes, controlando todo desde bajo nivel con C.
Minishell es una aplicación que interpreta comandos escritos por el usuario en un entorno de línea de comandos interactivo. Soporta comandos encadenados con pipes, redirecciones de entrada/salida, variables de entorno, y varios built-ins, siguiendo el comportamiento de Bash.
- Gestión de procesos con
fork,execve,wait, ysignal. - Soporte de redirecciones:
<,>,>>,<<. - Interpretación de variables de entorno, incluido
$?. - Gestión de señales (
Ctrl-C,Ctrl-D,Ctrl-\). - Historial y lectura interactiva con
readline. - Comandos built-in:
cd,echo,env,export,exit,pwd,unset. - Pipelines para conectar comandos (
ls | grep x). - Manejo de errores y código de salida coherente.
- Ejecución de comandos incluso sin variables de entorno (
env -i ./minishell).
Makefile→ Compila el proyecto con reglas estándar (all,clean,fclean,re). También incluye reglas personalizadas comomake printpara visualizar lo que se almacena en las estructuras del lexer y el parser.main.c→ Punto de entrada de la shell, inicializa estructuras y entra en el bucle de ejecución.main_utils.c→ Funciones auxiliares utilizadas pormain.c, como validaciones o inicializaciones.free_structs.c→ Libera estructuras y recursos dinámicos para evitar memory leaks.signals.c→ Manejo de señales comoSIGINT(Ctrl-C),SIGQUIT(Ctrl-) y su impacto en la shell.minishell.h→ Archivo de cabecera principal con prototipos, estructuras y macros compartidas.
built-ins/→ Implementación de comandos internos (cd,echo,env,exit,export,pwd,unset) según especificación del proyecto.exec/→ Gestión de la ejecución de comandos, incluyendo creación de procesos, pipes y duplicación de descriptores.gnl/→ Implementación deget_next_line, útil para lecturas personalizadas o heredoc.heredoc/→ Lógica del heredoc (<<) y control de su comportamiento en combinación con señales.lexer/→ Tokenización de la línea de comandos: división de palabras, gestión de comillas, metacaracteres, etc.parser/→ Construcción de estructuras de comandos a partir de los tokens generados por el lexer.print/→ Código de depuración. Contiene unmainespecial para imprimir y analizar estructuras (make print).redirections/→ Módulo que gestiona las redirecciones de entrada y salida (<,>,>>,<<).text_visualizer/→ Contiene el comandojp, un visualizador de texto desarrollado para representar visualmente estructuras como árboles sintácticos.utils/→ Funciones auxiliares utilizadas en distintas partes del código (manejo de errores, strings, validaciones, etc.).libft/→ Funciones de la librería.
-
Compilación:
make
-
Ejecución:
./minishell
-
Salida esperada:
- Un prompt interactivo.
- Comandos ejecutados como en Bash.
- Soporte para redirecciones, pipes y variables de entorno.
Otra forma de usarlo sería haciendo:
make printpara visualizar lo que se almacena en las estructuras del lexer y el parser.
echo [-n]cd [dir]pwdexport [VAR=VAL]unset VARenvexit [status]
>: salida.<: entrada.>>: append.<<: heredoc.
- Soporte completo de múltiples pipes:
ls | grep .c | wc -l.
cc *.c -Wall -Wextra -Werrorsin-gnisanitizemake -rpara ver flags del Makefile
valgrind ./minishell(¡cuidado conreadline!)
echo $? # Verifica salida anterior
commandnotfound # Debe dar 127
. # Da 2
./folder # Da 126
cd notadir # Da 1echo $$$$echo -nnnn hola,echo -nnnnp holaecho "$USER '$USER'",echo "'$USER'", etc.- Comillas, variables, espacios, combinaciones raras.
- Manejo de valores vacíos, duplicados, export dinámico y ejecución de variables como comandos.
cd,cd -,cd ~,cd .., etc.
- Combinaciones con varios argumentos, valores no numéricos, negativos.
ls > a > b > ccat < 1 < 2 > 3sleep 2 | lsy comprobaciones de ejecución simultánea
<<, uso de pipes, Ctrl+C, delimitadores estrictos
- Comillas sin cerrar
- Comandos con caracteres especiales o inválidos
- Expresiones raras como
ec'h''o'ols '-la'
- Sin memory leaks (salvo los conocidos de
readline). - Sin "seg faults".
- Manejo correcto de señales en modo interactivo.
- Ejecuta comandos internos y externos con y sin
PATH. - Salida coherente del programa tras errores.
SHLVLactualizado si se lanza una minishell desde otra.- Seguir la norma de 42.

