Este proyecto implementa un shell similar a bash con una estructura modular bien organizada. El código está diseñado siguiendo principios de programación limpia y mantenible, separando las responsabilidades en diferentes módulos para facilitar su comprensión y futuras extensiones. La arquitectura del proyecto permite gestionar de manera eficiente la entrada de comandos, su análisis sintáctico, y la ejecución de procesos, manteniendo la compatibilidad con las funcionalidades básicas de un intérprete de comandos tipo Unix.
42-MINISHELL/
├── .gitignore
├── CONVENTIONS.md
├── Makefile
├── README.md
├── eval_minishell.pdf
├── minishell.pdf
│
├── includes/
│ └── minishell.h
│
├── libft/ # Biblioteca de funciones auxiliares
│ ├── ft_*.c # 45 funciones de la libft
│ ├── libft.h
│ └── Makefile
│
└── src/
│
├── builtins/ # Comandos integrados del shell
│ ├── cd.c # Cambiar directorio
│ ├── echo.c # Imprimir texto
│ ├── env.c # Mostrar variables de entorno
│ ├── exit.c # Salir del shell
│ ├── export.c # Exportar variables
│ ├── pwd.c # Directorio actual
│ └── unset.c # Eliminar variables
│
├── execution/ # Ejecución de comandos
│ ├── exec.c # Ejecutor principal
│ ├── execution_builtins.c # Ejecución de builtins
│ ├── execution_helpers.c # Funciones auxiliares
│ ├── execution_utils.c # Utilidades de ejecución
│ ├── pipes.c # Gestión de pipes
│ ├── pipes_exec.c # Ejecución con pipes
│ ├── pipes_process.c # Procesos de pipes
│ ├── pipes_utils.c # Utilidades de pipes
│ ├── redirections.c # Redirecciones I/O
│ └── redirections_utils.c # Utilidades de redirecciones
│
├── expansion/ # Expansión de variables
│ ├── expansion.c # Expansión principal
│ ├── expansion_command.c # Expansión en comandos
│ ├── expansion_fixed.c # Correcciones de expansión
│ ├── expansion_fixed_utils.c
│ ├── expansion_new.c # Nueva lógica de expansión
│ ├── expansion_safe.c # Expansión segura
│ └── expansion_utils.c # Utilidades de expansión
│
├── main/ # Núcleo del shell
│ ├── main.c # Punto de entrada
│ ├── shell_cleanup.c # Limpieza de recursos
│ ├── shell_init.c # Inicialización
│ ├── shell_loop.c # Bucle principal
│ └── shell_process.c # Procesamiento de comandos
│
├── parser/ # Análisis sintáctico
│ ├── check_syntax.c # Validación de sintaxis
│ ├── lexer_free.c # Liberación de memoria del lexer
│ ├── lexer_quote.c # Manejo de comillas
│ ├── lexer_redirect.c # Análisis de redirecciones
│ ├── lexer_tokens.c # Tokenización
│ ├── lexer_word.c # Análisis de palabras
│ ├── parser_args.c # Parsing de argumentos
│ ├── parser.c # Parser principal
│ ├── parser_command.c # Parsing de comandos
│ ├── parser_redirect.c # Parsing de redirecciones
│ └── tokenizer.c # Tokenizador
│
└── utils/ # Utilidades generales
├── env_array.c # Manejo de arrays de entorno
├── env_get_set.c # Obtener/establecer variables
├── env_init.c # Inicialización del entorno
├── env_unset_free.c # Liberar variables de entorno
├── error_print.c # Impresión de errores
├── error_utils.c # Utilidades de errores
├── signal_restore.c # Restauración de señales
└── signals.c # Gestión de señales
make # Compile the project
make clean # Remove object files
make fclean # Remove object files and executable
make re # Rebuild everything
make help # Show available targetsEtiquetas: infra, setup
- Crear estructura de carpetas (
src,include,libft, etc.) - Crear Makefile con reglas requeridas (
all,clean,fclean,re,bonus) - Integrar libft con su propio Makefile en
/libft - Configurar readline e input interactivo básico (mostrar prompt)
- Configurar manejo de errores y logs
- Crear documento interno de convenciones (nombres de funciones, estructuras, comentarios)
Etiquetas: parser, core
- Implementar tokenizer (manejar espacios, comillas simples y dobles)
- Implementar parser para comandos simples y múltiples
- Detectar errores de sintaxis (pipes mal cerrados, redirecciones incompletas)
- Construcción de estructura de comandos (
t_command, por ejemplo) - Implementar soporte para múltiples comandos conectados por
| - Manejar redirecciones
<,>,>>,<<en el parser - Detectar y separar built-ins de comandos externos
Etiquetas: exec, builtin, core
- Ejecutar comandos externos usando
execvecon$PATH - Implementar built-in:
echocon opción-n - Implementar built-in:
cdcon rutas relativas y absolutas - Implementar built-in:
pwd - Implementar built-in:
export - Implementar built-in:
unset - Implementar built-in:
env - Implementar built-in:
exit
Etiquetas: redirections, pipes, core
- Implementar redirección de entrada (
<) - Implementar redirección de salida (
>) - Implementar redirección en modo append (
>>) - Implementar heredoc (
<<) - Implementar ejecución con pipes (
|) entre múltiples comandos
Etiquetas: expansion, env
- Implementar expansión de variables de entorno (
$VAR) - Implementar expansión de
$?(estado de último comando) - Manejar variables dentro de comillas dobles correctamente
- Evitar expansión dentro de comillas simples
Etiquetas: signals, input
- Manejar Ctrl-C para cancelar entrada y mostrar nueva línea
- Manejar Ctrl-D para salir del minishell
- Manejar Ctrl-\ para que no tenga efecto
- Usar una sola variable global (solo número de señal recibida)
- Configurar
sigactionysignalsegún sea necesario
Etiquetas: testing, debug, review
- Crear pruebas básicas con comandos comunes (manual testing implemented)
- Verificar que no hay segfaults en funcionalidad básica
- Asegurar compilación sin warnings
- Verificar comportamiento frente a entradas inválidas
- Ejecutar con valgrind para revisar leaks
- Comparar resultados con bash para cada funcionalidad
- Validar comportamiento con redirecciones múltiples
- Validar que pipes funcionan en cadena
Etiquetas: style, norm
- Asegurar cumplimiento de Norminette en todos los
.cy.h - Dividir código en funciones limpias y reutilizables
- Documentar funciones clave (
///, comentarios) - Eliminar funciones no utilizadas o debugging
| Nombre | GitHub | |
|---|---|---|
| Kiko | @krub-dev | Kiko |
| Oleksii | @oreshnyk | Oleksii |
Proyecto realizado como parte del Common Core 42.
¡Gracias por revisar nuestro trabajo!
