Files
2026-02-09 20:47:43 +01:00

73 lines
2.6 KiB
Markdown

# 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."