Este projeto é uma implementação simplificada de um shell Unix, chamada Minishell, parte do currículo da Escola 42 São Paulo. O objetivo é criar uma interface de linha de comando que permite aos usuários interagir com o sistema operacional, executar comandos, gerenciar processos e manipular a entrada e saída de dados.
O projeto foi dividido em quatro partes principais:
Objetivo: Converter a entrada de texto em uma sequência de tokens.
Detalhes:
- Entrada: Comandos do usuário como uma string.
- Saída: Lista de tokens.
Processo:
- Dividir a string de entrada em componentes menores (tokens) com base em espaços e caracteres especiais.
- Identificar cada componente como um tipo específico de token (e.g., comando, argumento, operador).
- Lidar com aspas (simples e duplas) e caracteres de escape.
Objetivo: Construir uma estrutura de dados (árvore de análise sintática/binária) a partir da sequência de tokens.
Detalhes:
- Entrada: Lista de tokens gerada pelo lexer.
- Saída: Árvore de análise sintática.
Processo:
- Construir uma árvore de comandos onde cada nó representa um comando ou uma operação.
- Verificar se a sequência de tokens segue as regras gramaticais do shell.
- Detectar e reportar erros sintáticos.
Objetivo: Lidar com a expansão de variáveis de ambiente e substituições de comandos.
Detalhes:
- Entrada: A árvore de análise sintática ou a lista de tokens.
- Saída: Lista de tokens com as expansões aplicadas.
Processo:
- Substituir variáveis de ambiente (e.g.,
$HOME
) por seus valores. - Executar comandos dentro de crases (
cmd
) e substituir a saída no lugar.
Objetivo: Executar os comandos representados pela árvore de análise sintática.
Detalhes:
- Entrada: A árvore de análise sintática com expansões aplicadas.
- Saída: Resultados da execução dos comandos.
Processo:
- Executar comandos internos e externos.
- Criar processos filho, redirecionar entrada/saída e esperar a conclusão dos processos.
- Capturar e reportar erros de execução.
Um exemplo de comando que passa por todas essas etapas:
find /home/user -name "*.txt" | grep "important" > results.txt
- Comando: find, grep
- Operador: |, >
- Argumentos: /home/user, -name "*.txt", "important", results.txt
Este comando pesquisa todos os arquivos .txt no diretório /home/user, filtra os resultados para encontrar aqueles que contêm a palavra "important", e redireciona a saída para o arquivo results.txt.
Este projeto Minishell, dividido em quatro partes distintas (lexing, parsing, expand e exeutor), permite uma abordagem modular e estruturada para a implementação de um shell Unix simplificado. Cada etapa tem uma responsabilidade clara, garantindo um fluxo de processamento organizado desde a entrada do comando até a sua execução final.