{"id":20757316,"url":"https://github.com/fernandams/fso-shell","last_synced_at":"2025-03-11T16:20:26.917Z","repository":{"id":123660760,"uuid":"518222067","full_name":"fernandams/FSO-shell","owner":"fernandams","description":"Repositório com o primeiro trabalho da disciplina Fundamentos de Sistemas Operacionais da Universidade de Brasília (UnB).","archived":false,"fork":false,"pushed_at":"2022-08-10T10:44:42.000Z","size":20,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-18T04:43:36.676Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fernandams.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-07-26T21:27:57.000Z","updated_at":"2022-08-10T02:03:47.000Z","dependencies_parsed_at":null,"dependency_job_id":"7e487f76-134b-4a84-b054-2a7809fe1041","html_url":"https://github.com/fernandams/FSO-shell","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandams%2FFSO-shell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandams%2FFSO-shell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandams%2FFSO-shell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandams%2FFSO-shell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fernandams","download_url":"https://codeload.github.com/fernandams/FSO-shell/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243067001,"owners_count":20230849,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-17T09:41:27.420Z","updated_at":"2025-03-11T16:20:26.895Z","avatar_url":"https://github.com/fernandams.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Trabalho de Sistemas Operacionais - Shell\n\nRepositório com o primeiro trabalho da disciplina Fundamentos de Sistemas Operacionais da Universidade de Brasília (UnB).\n\n# **Especificação do trabalho**\n\n## 1 - Objetivo\n\nImplementar um **shell de Sistema Operacional simples**, que tenha uma interface mais natural com os usuários que falam o português, o **BRshell** ou simplesmente **BRsh**.\n\n## 2 - Sintaxe dos comandos\n\nA linha de comando do shell deve aceitar o seguinte formato\n\n`1. cmdo_name arg[1] arg[2] ... arg[n]`\n\nUm comando consiste de um nome do comando seguido de um ou mais argumentos. \n\nEx: `ps -elf`\n\n`2. pipe_section[1] | pipe_section[2] | pipe_section[3] | ... | pipe_section[n]`\n\nUm comando consiste de uma ou mais \"pipe sections\", sendo que cada um é um simples comando separado pelo caracter **|**. Ex: `ps -elf | grep user | more`\n\nCada comando aparece em uma única linha e é terminado pelo caracter **newline**. O shell deve imprimir no prompt \"`BRsh - nome do usuário – diretório corrente -\u003e`\" quando estiver pronto para receber um novo comando. **Ele deve processar o comando imediatamente ao receber um caracter newline e sair quando o comando exit for encontrado.**\n\nNão assuma nenhum tamanho limite na linha de comando, incluindo o número de caracteres de comando, o número de argumentos e o número de pipe sections. Também não limite o número de processos que podem rodar em background.\n\n## 3 - Localização do comando\n\nPara configurar o shell, este possui um arquivo de configuração, o **`.BRbshrc_profile`**, que deverá estar no home do usuário.\n\nOs executáveis deverão ser procurados nos diretórios listados na variável PATH e na ordem em que aparecem neste diretório. A sintaxe deverá ser a seguinte: `PATH=path1;path2;path3; . . . ;pathN.`\n\nO shell deve procurar o comando em cada um dos diretórios acima e tentar executá-los. Em caso de falha, informe o erro ao usuário com a seguinte mensagem:\n\n`BRsh-user1-/home/user1\u003e:Não achei o combando`\n\n## 4 - Histórico\n\n**O BRsh deve se lembrar dos últimos 10 comandos digitados.** Para visualizar os comandos basta digitar \"`historico`\". Com a chamada a `historico` o BRsh deve imprimir no stdout os últimos 7 comandos, sendo que o último comando digitado deve aparecer primeiro, o penúltimo em segundo e assim sucessivamente.\n\n```bash\nBRsh-\u003ehistorico\n\n1 ps\n\n2 ls -al | grep aa\n\n3 pwd\n\n4 who\n\n5 mkdir tmp\n\nBRsh-\u003e\n```\n\nNo exemplo existem apenas 5 comandos desde que o BRsh entrou em funcionamento. Quando o usuário entra com o comando \"`historico !\\n`\", onde n é um inteiro de 1 a 7, o shell executa o comando correspondente imediatamente. Por exemplo:\n\n```bash\nBRsh-\u003ehistory 3\nBRsh-\u003epwd\n```\n\ne este comando deve ser colocado na fila de comando executados. Se o argumento n do comando historico não existir, avisar o usuário.\n\n`BRsh-\u003e Comando fora do intervalo do historico`\n\nMantenha a lista de comandos como em uma fila FIFO.   \n\n## 5 - Comandos em background\n\nNormalmente o shell processa um comando criando um processo filho para cada \"pipe section\" e espera todos os filhos terminarem antes de aceitar um novo comando. Se o operador `\u0026` aparecer no final da linha de comando, o BRsh deve criar o processo filho e iniciar sua execução e não esperar o término para aceitar um novo comando. Quando o comando em background for iniciado, ele deve imprimir uma mensagem:\n\n```bash\nBRsh-user1-/home/user1\u003etextedit \u0026\n\nBRsh-user1-/home/user1-\u003eProcesso em background [n] foi iniciado\n\nBRsh-user1-/home/user1-\u003e\n```\n\nQuando o processo em background termina, ele deve imprimir uma linha antes do próximo prompt:\n\n```bash\nBRsh-user1-/home/user1-\u003e\"Processo em background [n] [executado] \"comando arg1 arg2 ... argN\n\nBRsh-user1-/home/user1-\u003e\n```\n\nonde n é um número único gerado pelo BRsh. Ele funciona como um identificador para o programa executado em background. \n\n## 6 - Redirecionador de comandos\n\nO BRsh deve ser capaz de mudar o stdin e o stdout para arquivos de entrada e saida, respectivamente.\n\nExemplo:\n\n`BRsh-user1-/home/user1\u003e  wc -l \u003c entrada.text`\n\nO símbolo `\u003c` sucedendo um comando ou programa indica que sua entrada não se dará pelo teclado, mas sim de um arquivo existente.\n\n`BRsh-\u003e ls \u003e saida.txt`\n\nO símbolo `\u003e` após um comando ou programa indica que sua saída não se dará para o terminal, mas será redirecionado para o arquivo *saida.txt*, que **deverá ser criado pelo BRsh**.\n\n`BRsh-user1-/home/user1\u003els -a \u003e\u003e saida.txt`\n\nO símbolo `\u003e\u003e` após um comando ou programa indica que sua saída não se dará para o terminal, mas será redirecionado para o arquivo *saida.txt* que será acrescentado do novo conteúdo (***append***).\n\n## 7 - comando ver\n\nO BRsh deve com o comando `ver`, implementado internamente (ou seja, não é um outro programa), mostrar a versão do BRshell, sua data de atualização e seu autor.\n\n## 8 - Gerenciamento de Recursos\n\nO BRsh deve liberar a memória e os recursos que não precise mais usar. Os processos filhos criados devem fazer a chamada `wait` de forma apropriada de forma a liberar os recursos após o seu fim. \n\n## 9 - Tradução para o português\n\nNo arquivo `**.BRshrc**` devem estar os alias dos comandos e utilitários originalmente nomeados em inglês para o seu respectivo em português. \n\nExemplo: \n\nO utilitário `cd` deverá ter o seguinte alias:\n\n```\nalias \"cd\" \"mudar\".\n```\n\nAssim como os utilitário `ps`, `rm`, `mkdir`, `mv`, `cp`, `ls`, `grep`, `wc`, `echo`, `compila`, `cat`, `find`:\n\n```\nalias \"ps\" \"processos\"\nalias \"rm\" \"remove\"\nalias \"mkdir\" \"criadir\"\nalias \"mv\" \"move\"\nalias \"cp\" \"copia\"\nalias \"ls\" \"lista\"\nalias \"grep\" \"filtra\"\nalias \"wc\" \"conta\"\nalias \"echo\" \"ecoa\"\nalias \"cat\" \"mostra\"\nalias \"find\" \"acha\"\nalias \"sleep\" \"dorme\"\n```\n\nOs aliases deverão ser um por linha.\n\n## 10 - Processamento de comandos e programas em lote\n\nO BRsh deve identificar um arquivo em lote quando ele for executável e sua primeira linha tiver a seguinte sequência de caracteres:\n\n`#!/path/BRsh`, sendo o \"path\" o diretório do executável.\n\nIniciar o shell especificado e executar as instruções do arquivo em lote.\n\nPor exemplo, o arquivo **`teste.BRsh`** possui o seguinte conteúdo:a\n\n```bash\n#o caracter # no início da linha significa que a linha é de comentário\n\n#! /usr/bin/BRsh\n\nprocessos -elf \u003e texto.txt\n\nconta -l \u003c texto.txt\n\nacha / | filtra ime \u003e /dev/null \u0026\n\ndorme 100\u0026\n\npwd\n\ncriadir meu_dir\n\nmuda meu_dir\n\nmove ../texto.txt ../meu_dir/.\n\nhistorico\n\nhistorico 5\n\n#nova bateria de comandos\n\nmuda ..\n\ncriadir tmp\n\nlista -a \u003e ./tmp/saida.txt\n\nmuda tmp\n\nmostra saida.txt ../meu_dir/texto.txt | conta -l\n\nuname -a\n\n# aqui neste ponto compila um programa c qualquer (exemplo.c) que imprime “Alo UnB. Feliz 2022!”.\n\ngcc -o exemplo exemplo.c\n\ncriadir bin\n\nmuda exemplo ./bin/.\n\nexemplo\n\n#fim do arquivo em lote\n```\n\n**Obs: O trabalho deve ser executado em máquinas LINUX**\n\n# **Funcionalidades implementadas**\n\n- [x] Sintaxe dos comandos\n    - [ ] Pipe\n- [x] Localização dos comandos\n- [x] Histórico\n- [ ] Comandos em background\n- [ ] Redirecionador de comandos\n- [x] Comando ver\n- [x] Gerenciamento de recursos\n- [x] Tradução para o português\n- [ ] Processamento de comandos e programas em lote\n\n# **Compilação e execução**\nExecute ```make``` para compilar e executar usando o makefile.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffernandams%2Ffso-shell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffernandams%2Ffso-shell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffernandams%2Ffso-shell/lists"}