# Minishell - Guion de defensa (version codex) Este guion esta alineado con la estructura real en `minishell-codex/`. ## 1. Explicacion corta del proyecto - Minishell es un interprete de comandos interactivo. - Implementa pipes, redirecciones, variables y builtins basicos. - Se basa en el flujo: lectura -> lexer -> parser -> expansion -> ejecucion. ## 2. Flujo completo (paso a paso) 1. `readline()` muestra el prompt y devuelve la linea. 2. `lex_line()` divide la linea en tokens (`TOK_WORD`, `TOK_PIPE`, redirecciones). 3. `parse_tokens()` construye la pipeline con comandos y redirecciones. 4. `expand_pipeline()` aplica expansion de `$VAR` y `$?` respetando comillas. 5. `execute_pipeline()` resuelve `PATH`, prepara heredocs y ejecuta. ## 3. Estructuras clave - `t_token`: tipo y texto de tokens (`minishell-codex/include/minishell.h`). - `t_command`: argv, redirecciones, path. - `t_pipeline`: lista de comandos. - `t_redir`: tipo, target y fd. - `t_shell`: estado global (env, exit_status, flags). ## 4. Lexer (por que esta separado) - Maneja comillas y metacaracteres sin mezclar con ejecucion. - Detecta errores de comillas sin cerrar. - Facilita el parseo posterior. ## 5. Parser - Convierte tokens en comandos reales. - Cada `TOK_PIPE` crea un nuevo comando. - Redirecciones se guardan en lista separada (`t_redir`). - Valida errores (pipe sin comando, redireccion sin destino). ## 6. Expansion - `expand_pipeline()` recorre argv y targets de redireccion. - Reglas: - En comilla simple no se expande. - En comilla doble si se expande. - `$?` es el exit status anterior. ## 7. Redirecciones y heredoc - `apply_redirections()` abre y hace `dup2()`. - `prepare_heredocs()` genera un pipe con el contenido. - Heredoc no se mete en el historial. ## 8. Ejecucion y pipes - Si hay un solo builtin, se ejecuta en el padre. - Si hay pipeline, todos se forkean. - Se conectan con `pipe()` y `dup2()`. - Se espera a todos, y el exit status es el del ultimo comando. ## 9. Builtins - Implementados en `src/builtins/builtins.c`. - `echo`, `cd`, `pwd`, `env`, `export`, `unset`, `exit`. - `export` valida identificadores y permite `KEY=VALUE`. ## 10. Señales - Una sola global: `g_signal`. - `ctrl-C`: limpia linea y muestra prompt. - `ctrl-\`: se ignora en interactivo. - En child se restauran señales por defecto. ## 11. Ejemplos rapidos para demostrar - Pipes: `ls | wc -l` - Redireccion: `echo hola > out.txt` - Heredoc: `cat << EOF` -> texto -> `EOF` - Expansion: `echo $HOME`, `echo $?` ## 12. Mensaje final recomendado "Separar lexer, parser, expansion y ejecucion me permitio mantener el codigo claro y replicar el comportamiento de bash para el minimo requerido por el subject."