Reading Time: 3 minutes

Deixo-vos então um pequeno exemplo de como construir um pequeno shell em C.


Pode ser muito bem adaptado para que receba valores da linha de comandos.

Acho que não valerá apena estar a explicar linha por linha, visto que é uma programação muito básica, se houver uma dúvida digam.

Source:

http://pastebin.com/cW1HP3eB

  1. /*##################################################
  2. ##  SIMPLES SHELL EM C / WINDOWS                  ##    
  3. ##                                                ##      
  4. ##  @2011  BY PEDRO TAVARES                       ##        
  5. ##  http://infptavares.blogspot.com               ##          
  6. ##                                                ##            
  7. ##################################################*/
  8. /*  DECLARACAO DE BLIBLIOTECAS  */
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12. /*  PROTOTIPOS DE FUNCOES  */
  13. void prompt();
  14. void _parse();
  15. void wordpad();
  16. void ler();
  17. /*  FUNCAO <ABRIR/MOSTRAR> FICHEIRO  */
  18. void ler(){
  19.      
  20.      FILE *F;
  21.      char nome[20];                              /*  DECLARACAO ESTATICA DE VARIAVEIS */                          
  22.      char buff[200];
  23.      
  24.      printf(nn.::::::::::::::: MOSTRA FICHEIRO :::::::::::::::.nn);
  25.      printf(nQual o nome do ficheiro que deseja abrir?”);
  26.      scanf(“%s”,&nome);
  27.      
  28.      F=fopen(nome,“r”);                          /*  ABERTURA DO FICHEIRO  */
  29.      if(F==NULL){
  30.            printf(“Ficheiro Invalido!!nn);
  31.            return;    
  32.      }
  33.        
  34.      while(!feof(F)){
  35.                      
  36.           fgets(buff,200,F);                     /*  LISTAGEM  */
  37.           printf(“%s”,buff);
  38.                      
  39.      }
  40.      
  41.      fclose(F);                                 /*  FECHO DO FICHEIRO  */    
  42. return;    
  43. }
  44. /*  FUNCAO <ESCREVER> FICHEIRO  */
  45. void wordpad(){
  46.      FILE *F;                                   /*  DECLARACAO ESTATICA DE VARIAVEIS */
  47.      char nome[20];
  48.      char buff[200];
  49.      
  50.      printf(“Qual o nome do novo ficheiro?”);    
  51.      scanf(“%s”,&nome);
  52.      
  53.      F=fopen(nome,“a”);                         /*  ABERTURA DO FICHEIRO  */
  54.      
  55.      while(strcmp(buff,“exit”)!=0){
  56.          scanf(“%s”,buff);                          
  57.          fputs(buff,F);                         /*  ENVIAR DADOS PARA O FICHEIRO  */
  58.          fputs(n,F);  
  59.      }
  60.      
  61.      fclose(F);                                /*  FECHO DO FICHEIRO  */
  62.      
  63.      
  64. return ;    
  65. }
  66. /*  FUNCAO PARSING <ANALISA STRING>  */
  67. void _parse(char *buff){
  68.      int i;
  69.      for(i=0;i<strlen(buff);i++){
  70.       /* TESTAR E VERIFICAR AS CONDICOES E CHAMAR OPERACAO */
  71.                                
  72.           if(strcmp(&buff[i],“sair”)==0){
  73.               exit(0);                          
  74.           }                        
  75.           if(strcmp(&buff[i],“ls”)==0){
  76.                                  
  77.               system(“dir”);                        
  78.           }
  79.           if(strcmp(&buff[i],“wordpad”)==0){
  80.            
  81.               wordpad();            
  82.           }
  83.      
  84.           if(strcmp(&buff[i],“ler”)==0){
  85.            
  86.               ler();            
  87.           }
  88.       }
  89.        
  90. return ;    
  91. }
  92. /*  FUNCAO PROMPT :>  */
  93. void prompt(){
  94.      printf(“:>”);
  95. return;    
  96. }
  97. /*  FUNCAO MAIN  */
  98. int main (){
  99.     char buff[200];    
  100.    
  101.     printf(“Bem vindo a minha SHELL o_On);
  102.     printf(“As opcoes implementadas sao:  dir ; ler ; wordpad ; sairnnn);
  103.     while(1){
  104.    
  105.             prompt();
  106.             scanf(“%s”,buff);
  107.              
  108.             _parse(buff);
  109.              
  110.     }
  111. return 0;    
  112. }