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.
Por Rafaela Bustamante e Raphael dos Santos Esteves, cadetes na 42 São Paulo.
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.
🔪 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.
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.