Este projeto tem o objetivo de escrever um shell simples utilizando C.
- Sobre o Projeto
- Utilização
- Dependências
- Instalação
- Funcionalidades
- Etapas de produção
- Fluxograma
- Autores
- Medalha
Um shell é uma interface de linha de comando que permite a interação com o sistema operacional. Ele permite a execução de comandos, navegação no sistema de arquivos e automação de tarefas rotineiras. Os shells mais populares incluem o bash (usado no Linux e macOS) e o cmd (usado no Windows). Neste projeto, utilizaremos o bash como base para o desenvolvimento do minishell.
Você pode usar o Minishell normalmente como o próprio Bash, mas deve estar ciente de que o Minishell tem algumas Funcionalidades limitadas em comparação com o Bash.
-
As seguintes bibliotecas:
- <signal.h>
- <stdio.h>
- <sys/types.h>
- <sys/stat.h>
- <dirent.h>
- <fcntl.h>
- <sys/wait.h>
-
Compilador gcc:
sudo apt-get update sudo apt-get install build-essential
-
Biblioteca Readline:
sudo apt-get install libreadline-dev
1 - Abra o terminal e digite o comando git clone https://github.com/gsmereka/42_Minishell.git para clonar o repositório para um diretório de sua escolha.
2 - Navegue até o diretório recém-clonado com o comando cd minishell.
3 - Execute o comando make para compilar o código-fonte e gerar o arquivo executável 'minishell'.
4 - Para executar o Minishell, navegue até o diretório onde o arquivo 'minishell' foi gerado e execute o comando ./minishell.
- [✔️] Exibição de um prompt quando esperando por um novo comando
- [✔️] Armazenamento do histórico de comandos executados
- [✔️] Manipulação de ctrl + C, ctrl + D e ctrl + \ durante a exibição do prompt.
- [✔️] Manipulação de ctrl + C, ctrl + D e ctrl + \ de acordo com o bash.
- [✔️] Manipulação de aspas simples (') e duplas (").
- [✔️] Manipulação de variáveis de ambiente.
- [✔️] Implementação de redirecionamentos de entrada e saída e uso de pipes (Apenas: <, <<, >>, > e |).
- [✔️] Implementação de comandos internos: echo, cd, pwd, export, unset, env e exit
- [✔️] Procura e inicialização do programa correto a partir de caminhos relativos e absolutos.
Abaixo estão descritas as etapas necessárias para o desenvolvimento do minishell.
A implementação do comportamento REPL (Read-Eval-Print Loop) é uma etapa crucial no desenvolvimento deste projeto. Ele permite a interação interativa com o usuário, lendo suas entradas, executando as demais etapas e exibindo os resultados em seguida apropriadamente. Ele então volta para o início do loop para ler a próxima entrada, permitindo ao usuário continuar a interagir com o programa.
O Lexer é responsavel pelo processamento correto dos comandos digitados pelo usuário. O lexer irá dividir a string de entrada do usuário em palavras-chave (tokens) específicas e mais fáceis de gerenciar. Isso é essencial para garantir que os comandos sejam interpretados corretamente e executados da forma esperada.
É o responsável por expandir o valor das variáveis de ambiente em cada token, garantindo que o comando final terá o resultado esperado. Também deve tratar as diferenças de comportamento entre aspas simples e aspas duplas.
O parser é responsável por analisar a sequência de palavras-chave geradas pelo lexer, verificando se elas seguem a formatação necessária antes de serem passadas para o executor.
O Executor é a parte responsável por receber a lista de palavras-chave formatada pelo parser, interpretar e definir a ordem de execução dos comandos. Ele também é responsável por lidar com os redirecionamentos de entrada e saída, garantindo que os dados sejam direcionados corretamente para os comandos. Ele também é responsável por realizar a execução efetiva dos comandos, garantindo que os comandos sejam executados de maneira adequada.
Gabriel Smereka |
Gabriela de Moraes da Silva |
---|