Minishell desarrollada en C.
Haz clic aquí para acceder al proyecto en GitHub.
Una implementación personalizada de un intérprete básico de comandos UNIX, hecho en C. Este proyecto busca replicar funcionalidades clave de shells como bash, incluyendo ejecución de comandos, pipes, redirecciones, gestión de variables de entorno y manejo de señales.
Resumen
Minishell analiza la entrada del usuario, construye una representación interna (Árbol de Sintaxis Abstracta - AST) y ejecuta los comandos. Maneja comandos externos ubicados en el PATH
del sistema y un conjunto de comandos internos.
Características
- Ejecución de comandos: Usa
fork
yexecve
para ejecutar comandos externos mediantePATH
. - Comandos internos: Implementa comandos básicos de shell (ver lista más abajo).
- Pipes (|): Permite encadenar comandos, conectando la salida estándar de uno con la entrada del siguiente.
- Redirecciones:
- Entrada (<): Lee de un archivo.
- Salida (>): Escribe en un archivo (sobrescribe).
- Salida con append (>>): Añade al final del archivo.
- Heredoc (<<): Lee entrada hasta encontrar un delimitador.
- Variables de entorno:
- Gestionadas con una lista enlazada.
- Soporta expansión (
$VAR
,$?
). - Se inicializa con el entorno del sistema (
envp
). - Maneja incremento de
SHLVL
.
- Señales:
- Maneja
SIGINT
(Ctrl+C) en modo interactivo y heredoc. - Ignora
SIGQUIT
(Ctrl+\) en modo interactivo. - Los procesos hijos usan el comportamiento por defecto.
- Maneja
- Historial de comandos: Usa la librería
readline
para navegación con flechas. - Comillas: Procesa comillas simples y dobles correctamente, afectando la expansión y tokenización.
Instalación y compilación
Requisitos previos:
- Compilador C (como
gcc
oclang
). make
.- Librería
readline
(puede requerirlibreadline-dev
oreadline-devel
).
Compilación:
- Clona el repositorio o ten el código fuente.
- Ve al directorio raíz del proyecto.
- Ejecuta
make
para compilar y crear el ejecutable.
git clone <url_del_repositorio> minishell
cd minishell
make
Uso
Tras compilar con éxito, ejecuta el shell:
./minishell
Verás el prompt minishell$
. Escribe comandos como en una shell normal. Usa Ctrl+D
o el comando exit
para salir.
Arquitectura
- core/: Bucle principal, lectura de entrada y estado del shell.
- parser/: Tokenización y construcción del AST.
- ast/: Estructuras del AST y funciones asociadas.
- executor/: Ejecuta comandos, maneja pipes, redirecciones y procesos.
- builtins/: Comandos internos del shell.
- env/: Manejo de variables de entorno.
- signals/: Configura y maneja señales POSIX.
- utils/: Funciones auxiliares.
- inc/: Archivos de cabecera.
Comandos internos
echo
: Imprime argumentos (soporta-n
).cd
: Cambia el directorio actual. Soporta~
y-
.pwd
: Muestra el directorio actual.export
: Define/muestra variables de entorno.unset
: Elimina variables de entorno.env
: Muestra las variables del entorno actual.exit
: Termina el proceso de minishell (acepta código de salida).
Detalles técnicos
- Análisis: Entrada dividida en tokens y convertida a AST para ejecución estructurada.
- Ejecución: Usa llamadas al sistema como
fork
,execve
,pipe
,dup2
,wait
ywaitpid
. - Entorno: Se gestiona con lista enlazada (
t_env
). - Entrada: Librería
readline
para edición e historial. - Señales: Uso de
sigaction
para manejo robusto.