Skip to content

proyecto de 42 que consiste en recodificar una versión básica de un terminal bash que tiene que manejar: ejecución de comandos, canalizaciones, redirecciones, variables de entorno y señales.

License

Notifications You must be signed in to change notification settings

zafraedu/minishell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

95 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

header minishell


AboutUsageMandatoryNorminetteLicense

A mini recreation of bash. Implementing previously learned concepts like file descriptors and processes. Made with Agustin Vincenti.

About

El shell es un programa que el usuario puede utilizar para interactuar con los servicios de un sistema operativo. Bash es el shell GNU y actualmente es el programa de shell más común. Tomamos el desafío de recrear bash muy literalmente, así que lo primero que hicimos fue aprender cómo funciona realmente bash con la ayuda de este artículo. Básicamente, divide el proceso en 3 pasos: lexer → parser → executor, que replicamos en nuestro proyecto.

Click aquí para ver el subject del proyecto.

Click aquí para ver la hoja de corrección del proyecto.

HOW TO USE

Compile

1 - Instalar dependencias para minishell:

sudo apt-get install make libreadline-dev

2 - Clonar el repositorio:

git clone https://github.com/zafraedu/minishell.git && cd minishell

3 - Ejecutar el Makefile

make && make clean

4 - Ejecutar el programa

./minishell

Makefile rules

  • make - Compila los archivos src/push_swap y genera el ejecutable push_swap;
  • make clean - Eliminas todos los objetos (*.o) generados al compilar;
  • make fclean - Elimina todos los objetos más el ejecutable;
  • make re - usa make fclean + make;

Mandatory

Nombre del programa minishell
Archivos a entregar Makefile, *.h, *.c
Argumentos
Makefile NAME, all, clean, fclean, re
Elementos autorizados readline(), rl_clear_history(), rl_on_new_line(), rl_replace_line(), rl_redisplay(), add_history(), printf(), malloc(), free(), write() , access(), open(), read(), close(), fork(), wait(), waitpid(), wait3/4(), signal(), sigaction(), kill(), exit(), getcwd(), chdir(), f/l/stat(), unlink(), execve(), dup/2(), pipe(), opendir(), readdir(), closedir(), strerror(), perror(), isatty(), ttyname(), ttyslot(), ioctl(), getenv(), tcsetattr(), tcgetattr(), execve(), tgetent(), tgetflag()tgetnum(), tgetstr(), tgoto(), tputs()
¿Libft permitido? SI
Descripción Escribe un shell

Este fue probablemente el proyecto más grande que he hecho hasta ahora, así como el primero que hice en grupo. El objetivo era crear una versión mini de bash, digo mini pero aún así era un proyecto enorme. Tuvimos que aprende cómo bash toma argumentos, los analiza y los ejecuta. Tuvimos que incorporar las siguientes características:

  • Mostrar una entrada mientras espera un comando nuevo
  • Tener un historial funcional.
  • Buscar y ejecutar el ejecutable correcto (basado en la variable PATH o mediante el uso de rutas relativas o absolutas).
  • Evita utilizar más de una variable global para indicar la recepción de una señal. Piensa en lo que implica: Esta aproximación evita que tu gestor de señales acceda a tus estructuras de datos principales.
  • No interpretar comillas sin cerrar o caracteres especiales no especificados en el enunciado como \ (barra invertida) o ; (punto y coma).
  • Gestionar que la ’ evite que el shell interprete los metacaracteres en la secuencia entrecomillada.
  • Gestionar que la " evite que el shell interprete los metacaracteres en la secuencia entrecomillada exceptuando $ (signo de dólar).
  • Implementar redirecciones:
    • '<' debe redirigir input.
    • '>' debe redirigir output.
    • “<<” debe recibir un delimitador, después leer del input de la fuente actual hasta que una línea que contenga solo el delimitador aparezca. Sin embargo, no necesita actualizar el historial.
    • “>>” debe redirigir el output en modo append.
  • Implementar pipes (carácter |). El output de cada comando en la pipeline se conecta a través de un pipe al input del siguiente comando.
  • Gestionar las variables de entorno ($ seguidos de caracteres) que deberán expandirse a sus valores.
  • Gestionar $?, que deberá expandirse al estado de salida del comando más reciente ejecutado en la pipeline.
  • Gestionar ctrl-C ctrl-D ctrl-\, que deberán funcionar como en bash.
  • Cuando sea interactivo:
    • ctrl-C imprime una nueva entrada en una línea nueva.
    • ctrl-D termina el shell.
    • ctrl-\ no hace nada.
  • Deberá implementar los built-ins:
    • echo con la opción -n.
    • cd solo con una ruta relativa o absoluta.
    • pwd pwd sin opciones.
    • export sin opciones.
    • unset sin opciones.
    • env sin opciones o argumentos.
    • exit sin opciones.

note: La función readline puede producir algunos leaks que no necesitas arreglar. Eso no significa que tu código, sí, el código que has escrito, pueda producir leaks.

NORME

En 42 School, se espera que casi todos los proyectos se escriban de acuerdo con la Norma, que es el estándar de codificación de la escuela.

- No for, do...while, switch, case, goto, ternary operators and variable-length arrays are allowed
- Each function must be a maximum of 25 lines, not counting the function's curly brackets
- Each line must be at most 80 columns wide, comments included
- A function can take 4 named parameters maximum
- No assigns and declarations in the same line (unless static)
- You can't declare more than 5 variables per function
- ...

42 NORMA información sobre las normas de código de 42. PDF

LICENSE

Este trabajo se publica bajo los términos de 42 Unlicense.

About

proyecto de 42 que consiste en recodificar una versión básica de un terminal bash que tiene que manejar: ejecución de comandos, canalizaciones, redirecciones, variables de entorno y señales.

Topics

Resources

License

Stars

Watchers

Forks

Contributors 2

  •  
  •