2.6 KiB
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)
readline()muestra el prompt y devuelve la linea.lex_line()divide la linea en tokens (TOK_WORD,TOK_PIPE, redirecciones).parse_tokens()construye la pipeline con comandos y redirecciones.expand_pipeline()aplica expansion de$VARy$?respetando comillas.execute_pipeline()resuelvePATH, 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_PIPEcrea 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 hacedup2().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()ydup2(). - 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.exportvalida identificadores y permiteKEY=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."