Files
minishell/minishell-codex/docs/defensa.md
2026-02-09 20:47:43 +01:00

2.6 KiB

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