save commit

This commit is contained in:
2026-02-09 20:47:43 +01:00
parent e983f7fe64
commit 280fa51f94
39 changed files with 3400 additions and 239 deletions

View File

@@ -0,0 +1,72 @@
# 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."

View File

@@ -0,0 +1,59 @@
# Minishell - Checklist de pruebas manuales
Ejecuta en `minishell-codex/`:
- `make`
- `./minishell`
## 1. Prompt y salida
- Iniciar y salir con `ctrl-D`.
- `exit` debe cerrar el shell con el ultimo status.
## 2. Comandos simples
- `ls`
- `pwd`
- `echo hola`
## 3. Builtins
- `echo -n hola` (sin salto de linea)
- `cd /` luego `pwd`
- `export TEST=42` luego `env | grep TEST`
- `unset TEST` luego `env | grep TEST` (no debe aparecer)
- `env` sin argumentos
- `exit 2`
## 4. Expansion
- `echo $HOME`
- `echo $?` despues de un comando que falle (ej: `ls noexiste`)
- `echo '$HOME'` (no expande)
- `echo "$HOME"` (si expande)
## 5. Pipes
- `ls | wc -l`
- `echo hola | cat`
- `cat /etc/passwd | grep root | wc -l`
## 6. Redirecciones
- `echo hola > out.txt` y luego `cat out.txt`
- `echo 1 >> out.txt` y luego `cat out.txt`
- `cat < out.txt`
## 7. Heredoc
- `cat << EOF`
- escribir varias lineas
- `EOF`
- Ver que se imprime todo lo escrito.
## 8. Comillas
- `echo "a b c"` (una sola palabra)
- `echo 'a b c'` (una sola palabra)
- `echo "a 'b' c"`
## 9. Errores de parseo
- `| ls` (no debe ejecutar)
- `echo hola >` (error)
- `echo "hola` (comillas sin cerrar)
## 10. Senales
- `ctrl-C` en prompt: debe limpiar linea y mostrar prompt nuevo.
- `sleep 5` y `ctrl-C`: debe interrumpir el proceso.
- `ctrl-\` no debe imprimir nada en prompt interactivo.