Minishell desarrollada en C.

Haz clic aquí para acceder al proyecto en GitHub.

Minishell

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 y execve para ejecutar comandos externos mediante PATH.
  • 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.
  • 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 o clang).
  • make.
  • Librería readline (puede requerir libreadline-dev o readline-devel).

Compilación:

  1. Clona el repositorio o ten el código fuente.
  2. Ve al directorio raíz del proyecto.
  3. 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 y waitpid.
  • 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.

Autores