Skip to content

vilsonsampaio/mini-shell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Mini Shell

Este projeto implementa um interpretador de comandos simples (Shell) utilizando a linguagem Python e chamadas diretas ao sistema operacional (system calls) para gerenciamento de processos e E/S.

Como Rodar

Como este shell é escrito em Python, basta ter o interpretador Python 3 instalado, abrir o terminal na pasta onde está o arquivo e executar o comando:

python3 main.py

Chamadas ao sistema utilizadas

Função Python Chamada ao sistema real Função no projeto
os.read() read() Ler comandos digitados
os.write() write() Exibir mensagens no terminal
os.fork() fork() Criar processo filho
os.execvp() execvp() Executar comandos externos
os.wait() wait() Fazer o processo pai aguardar
os._exit() _exit() Encerrar o processo filho após erro

Exemplos de comandos testados e suas saídas

ls

  • Entrada:

    > ls
  • Saída:

    shell.py    README.md

echo

  • Entrada:

    > echo hello world
  • Saída:

    hello world

cat

  • Entrada:

    > cat main.py
  • Saída:

    import os
    
      def writeMessage(message):
      os.write(1, message.encode())
    
    
      def readCommand():
      writeMessage("> ")
      data = os.read(0, 1024)
      return data.decode().strip()
    
    
      def executeCommand(string):
      commands = string.split()
      command = commands[0]
    
      childProcess = os.fork()
    
      isParentProcess = childProcess > 0
      if isParentProcess:
          os.wait()
          return
    
      try:
          os.execvp(command, commands)
      except FileNotFoundError:
          writeMessage(f"Comando não encontrado: {command}\n")
      except Exception as e:
          writeMessage(f"Erro ao executar comando: {str(e)}\n")
      os._exit(1)
    
    
      def main():
      command = readCommand()
    
      while (command != "exit"):
          executeCommand(command)
          command = readCommand()
    
    
      main()

Erro comando inexistente

  • Entrada:

    > banana
  • Saída:

    Comando não encontrado: banana

Encerrar o shell

  • Entrada:

    > exit
  • Saída:

    O shell é encerrado sem mensagem adicional

Limitações

  • Sem suporte a cd (Change Directory): O comando cd deve ser um comando interno (built-in) do shell. Se você executar cd /tmp neste shell, ele rodará em um processo filho. O filho mudará de diretório e morrerá, mas o processo pai (o shell) permanecerá no diretório original.

  • Sem Histórico: Pressionar a seta para cima (↑) não trará o comando anterior (imprimirá códigos de escape brutos).

  • Buffer Limitado: A leitura de comandos está limitada a 1024 bytes (os.read(0, 1024)).

  • Tratamento de Sinais: O shell não trata sinais como SIGINT (Ctrl+C), o que interromperá o shell inteiro ao invés de apenas o processo filho.

Demonstração

🎥 Clique para ver o vídeo de demonstração

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages