Skip to content

Esse projeto se trata de criar seu próprio simples bash, rodando seu próprio terminal.

Notifications You must be signed in to change notification settings

rafaelabdm/Minishell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

✏️ 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.

About

Esse projeto se trata de criar seu próprio simples bash, rodando seu próprio terminal.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published