Interpretador Comandos Unix Shell

O interpretador de comandos dos sistemas operacionais Unix e Unix-like é a interface tradicional para operar o computador. Por meio de comandos, o usuário direciona o sistema para tarefas específicas.

O interpretador, conhecido como shell, normalmente suporta uma linguagem de script para que os comandos possam ser executados de maneira sequencial, permitindo automatizar tarefas rotineiras.

Mas, internamente, o que faz o shell? Bem, as etapas básicas são as seguintes:

 


1. imprime o prompt de comando: $ para usuário ou # para root
2. lê a linha digitada pelo usuário
3. remove CRLF (\r\n) e depois separa a linha em strings, onde
houver espaço
4. fork(): duplica o conteúdo do próprio processo (parent) no
sistema, criando um processo filho (child)
* no child: execvp() executa o comando digtado – tipo ls -l
* no parent: wait(NULL) aguarda o processo filho terminar

 

Embora os shells mais avançados como bash e csh possuam uma enorme quantidade de funções, tais como as da biblioteca readline, um shell apenas com as etapas mencionadas acima funciona perfeitamente.

Aqui está o exemplo:

 


view plaincopy to clipboardprint?

1. /* 20090118 - AF */
2. #include
3. #include
4. #include
5. #include
6.
7. static char *stripcrlf(char *line)
8. {
9. char *p;
10. for(p = line; *p; p++)
11. if(*p == '\r' || *p == '\n') { *p = '\'; break; }
12. return line;
13. }
14.
15. static void split(char *line, char **args)
16. {
17. while(*line) {
18. while(*line && *line == ' ') *line++ = '\';
19. *args++ = line;
20. while(*line && *line != ' ') line++;
21. }
22. }
23.
24. int main()
25. {
26. char *p, line[4096], *args[sizeof line/2];
27.
28. for(;;) {
29. fprintf(stdout, getuid() ? "$ " : "# ");
30. fflush(stdout);
31.
32. memset(line, 0, sizeof line);
33. if(!fgets(line, sizeof line, stdin)) {
34. fprintf(stdout, "\n");
35. clearerr(stdin);
36. continue;
37. }
38.
39. p = stripcrlf(line);
40. if(*p) split(p, args);
41. else continue;
42.
43. if(!fork()) {
44. if(execvp(args[0], args) == -1) perror("exec");
45. } else wait(NULL);
46. }
47. return 0;
48. }

 

 


Associação SoftwareLivre

A Associação SoftwareLivre.org (ASL) é uma associação civil sem fins-lucrativos, com sede em Porto Alegre/RS que reúne empresários, profissionais liberais, estudantes e servidores públicos, estabelecendo relações com os mais diversos setores da sociedade como o poder público, universidades, empresas, grupos de usuários, hackers e ONGs. A ASL tem por principal objetivo tornar o software livre amplamente incluído na sociedade, propiciando espaço de discussão, apoio, fomento e organização de iniciativas nas mais diversas áreas relacionadas. - Site oficial da associação