About • Usage • Mandatory • Norminette • License
A mini recreation of bash. Implementing previously learned concepts like file descriptors and processes. Made with Agustin Vincenti.
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
subjectdel proyecto.Click aquí para ver la
hoja de correccióndel proyecto.
1 - Instalar dependencias para minishell:
sudo apt-get install make libreadline-dev2 - Clonar el repositorio:
git clone https://github.com/zafraedu/minishell.git && cd minishell3 - Ejecutar el Makefile
make && make clean4 - Ejecutar el programa
./minishell
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- usamake fclean+make;
| 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-Cctrl-Dctrl-\, que deberán funcionar como en bash. - Cuando sea interactivo:
ctrl-Cimprime una nueva entrada en una línea nueva.ctrl-Dtermina el shell.ctrl-\no hace nada.
- Deberá implementar los built-ins:
echocon la opción-n.cdsolo con una ruta relativa o absoluta.pwdpwd sin opciones.exportsin opciones.unsetsin opciones.envsin opciones o argumentos.exitsin 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.
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
Este trabajo se publica bajo los términos de 42 Unlicense.
