73 lines
2.6 KiB
Markdown
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."
|