Skip to content

Latest commit

 

History

History
69 lines (58 loc) · 4.11 KB

README.md

File metadata and controls

69 lines (58 loc) · 4.11 KB

✏️ Minishell


Esse projeto é sobre criar um simples shell. Sim, seu próprio bashizinho. Você aprenderá muito sobre processos e descritores de arquivos.
This project is about creating a simple shell. Yes, your own little bash. You will learn a lot about processes and file descriptors.

GitHub code size in bytes Code language count GitHub top language GitHub last commit

Por Rafaela Bustamante e Raphael dos Santos Esteves, cadetes na 42 São Paulo.


🐚 Sobre o projeto

As beautiful as a shell

Nesse projeto criamos o nosso próprio bash, em uma escala menor. O propósito dele é nos fazer trabalhar com múltiplos processos, file descriptors, tratamento de entrada do usuário, entre diversos outros desafios menores.
Ao realizar esse projeto ganhamos o conhecimento de como o bash funciona por baixo dos panos, como nosso input é tratado e como os comandos dados a ele são executados.
O Minishell é um projeto muito desafiador, por ser longo e ser o primeiro projeto colaborativo do currículo, forçando não apenas o nosso treinamento técnico, com o código em si, mas também nossas habilidades de comunicação, em todas as trocas com a sua dupla durante todo o processo).
Embora trabalhoso, é um projeto muito divertido e com um retorno de conhecimento e sentimento de realização enormes.

🤓 Um pouco sobre as etapas do código

🔪 PARSER: A primeira coisa a se fazer é separar o input do usuário e tipar cada argumento recebido. Para isso fizemos uma separação de processos, separando os inputs por cada '|' pipe encontrado e depois pelos espaços (tratamento especial quando há aspas). Isso nos deixava cada arumento em um token, onde conseguíamos tipar o que aquele token era: comando simples, argumento, buildin, arquivo, redirecionamento, etc.
📖 EXPANDER: Feito os tokens, o expander rodava eles em busca do '$' e das aspas para a expansão das variáveis de ambiente e remoção das aspas. Caso o expander encontrasse a variável descrida depois do símbulo ($), ele a substituia pelo seu valor (guardado na nossa variável envp), caso contrário, substituia pur vazio (""). Já as aspas, seguindo algumas regras, eram removidas do token.
🏁 EXECUTER: Com os tokens prontos para montar os comandos, o executor os juntavam em um array de strings (formato aceito pela função execve). Verificava a quantidade de processos, checando a quantidade de pipes, e abria processos filhos para lidar com os comandos. Checava o caminho disponível da variável PATH e passava para a função execve. O único caso em que o comando é rodado no processo pai é quando temos apenas um processo/comando e este é um Build-in. Os Build-ins serão descritos no próximo tópico.

🔨 BUILD-INS:
◦ ECHO (with option -n): printar os argumentos passados a ele.
◦ CD (with only a relative or absolute path): trocar de diretório.
◦ PWD (with no options): mostrar diretório atual.
◦ EXPORT (with no options): exportar as variáveis passadas como argumentos.
◦ UNSET (with no options): remover as variáveis passadas como argumentos.
◦ ENV (with no options or arguments): mostrar as variáveis de ambiente.
◦ EXIT (with no options): sair do minishell.

💻 COMO USAR:

Comando do terminal: ./minishell ;
Você precisa da biblioteca da externa readline instalada.
Os build-ins tem limitações de options, em caso de dúvida confiria descrição acima.