O Minishell é um projeto do currículo comum da escola 42 que consiste na criação de um interpretador de comandos (shell) simplificado em C, semelhante ao Bash. O objetivo principal é compreender o funcionamento interno de um sistema operativo, a criação de processos, manipulação de descritores de ficheiros (redirecionamentos) e comunicação entre processos (pipes).
- Execução de Binários: Executa qualquer comando presente no sistema (através da variável de ambiente
PATHou caminhos relativos/absolutos, ex:/bin/ls,./minishell). - Prompt Interativo: Exibe um prompt customizado (
TeamWork>) aguardando entrada do utilizador. - Histórico de Comandos: Navegação pelos comandos executados anteriormente usando as setas do teclado (com a biblioteca
readline).
O shell implementa os seguintes comandos internos (built-ins):
echo(com a opção-npara não imprimir nova linha).cd(com caminhos relativos ou absolutos).pwd(exibe o diretório atual de trabalho).export(adiciona/atualiza variáveis de ambiente).unset(remove variáveis de ambiente).env(lista as variáveis de ambiente ativas).exit(encerra o shell, aceitando códigos de saída numéricos).
- Redirecionamento de Entrada (
<): Redireciona a entrada padrão para ler a partir de um ficheiro. - Redirecionamento de Saída (
>): Redireciona a saída padrão para um ficheiro (sobrescrevendo o conteúdo). - Redirecionamento de Saída Append (
>>): Redireciona a saída padrão para um ficheiro (adicionando ao final). - Here-doc (
<<): Lê a entrada do utilizador até encontrar uma linha que corresponda exatamente ao delimitador fornecido. Suporta expansão de variáveis. - Pipes (
|): Encaminha a saída de um comando diretamente para a entrada do comando seguinte (ex:ls -la | grep "src" | wc -l).
- Expansão de Variáveis: Substitui
$NOME_VARpelo seu respetivo valor nas variáveis de ambiente. - Status de Saída (
$?): Expande para o código de status de retorno do último comando executado. - Gestão de Sinais:
Ctrl-C(SIGINT): Cancela o comando atual ou limpa a linha e exibe um novo prompt numa nova linha.Ctrl-D(EOF): Encerra o shell (saída limpa).Ctrl-\(SIGQUIT): Não faz nada no prompt interativo.
src/: Ficheiros fonte em C contendo a lógica principal do shell (parser, execução, built-ins, sinais, etc.).include/: Ficheiros de cabeçalho (minishell.h) com as estruturas de dados e protótipos de funções.libft/: Biblioteca utilitária customizada em C, contendo funções auxiliares comuns e implementações adicionais comoget_next_lineeft_printf.Makefile: Script de compilação contendo as regras padrão de build.
- Compilador
gccoucc - Ferramenta
make - Biblioteca
readlineinstalada no sistema (geralmente incluída na maioria das distribuições Linux/macOS, ou instalada via gestor de pacotes, ex:apt-get install libreadline-dev).
Para gerar o executável minishell, execute o comando:
makePara rodar o shell interativo:
./minishellPara remover apenas os ficheiros objeto (.o):
make cleanPara fazer uma limpeza completa (ficheiros objeto, bibliotecas e o executável final):
make fcleanPara recompilar do zero:
make re- nmatondo (Desenvolvedor principal)
- NdondaDaniel2020 (Contribuições e ajustes de built-ins, redirecionamentos e estabilização do heredoc)