shell_explain.c
上传用户:htgj9999
上传日期:2021-10-02
资源大小:4k
文件大小:2k
源码类别:

Shell编程

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <signal.h>
  4. #include <unistd.h>
  5. #include <pwd.h>
  6. #include <libgen.h>
  7. #include <sys/types.h>
  8. #include <readline/readline.h>
  9. #include <readline/history.h>
  10. char buf[BUFSIZ];
  11. char* myptr;
  12. char* mylim;
  13. char lastdir[100];
  14. void init_lastdir()
  15. {
  16. getcwd(lastdir, 99);
  17. }
  18. void set_prompt(char* prompt)
  19. {
  20. char host[100];
  21. char cwd[100];
  22. struct passwd* pwp;
  23. if(gethostname(host, 99) == -1) {
  24. strcpy(host, "unknown");
  25. } else {
  26. char* p = strchr(host, '.');
  27. if(p)
  28. *p = 0;
  29. }
  30. if(!getcwd(cwd, 99)) {
  31. strcpy(cwd, "unknown");
  32. } else {
  33. if(strcmp(cwd, "/") != 0)
  34. strcpy(cwd, basename(cwd));
  35. }
  36. pwp = getpwuid(getuid());
  37. sprintf(prompt, "[%s@%s %s]# ", (pwp ? pwp->pw_name : "unknown"), host, cwd);
  38. }
  39. extern void yylex();
  40. void history_setup()
  41. {
  42. using_history();
  43. stifle_history(50);
  44. read_history("/tmp/msh_history");
  45. }
  46. void history_finish()
  47. {
  48. append_history(history_length, "/tmp/msh_history");
  49. history_truncate_file("/tmp/msh_history", history_max_entries);
  50. }
  51. void display_history_list()
  52. {
  53. HIST_ENTRY** h = history_list();
  54. if(h) {
  55. int i = 0;
  56. while(h[i]) {
  57. printf("%d: %sn", i, h[i]->line);
  58. i++;
  59. }
  60. }
  61. }
  62. int main(int argc, char** argv)
  63. {
  64. // int ch;
  65. // int len;
  66. char* line;
  67. char prompt[200];
  68. signal(SIGINT, SIG_IGN);
  69. init_lastdir();
  70. history_setup();
  71. while(1) {
  72. /*
  73. print_prompt();
  74. len = 0;
  75. ch = getchar();
  76. while(len < BUFSIZ && ch != 'n') {
  77. buf[len++] = ch;
  78. ch = getchar();
  79. }
  80. if(len == BUFSIZ) {
  81. printf("command is too longn");
  82. break;
  83. }
  84. buf[len] = 'n';
  85. len++;
  86. buf[len] = 0;
  87. */
  88. set_prompt(prompt);
  89. if(!(line = readline(prompt))) 
  90. break;
  91. if(*line)
  92. add_history(line);
  93. strcpy(buf, line);
  94. strcat(buf, "n");
  95. myptr = buf;
  96. mylim = buf+strlen(buf);
  97. yylex();
  98. }
  99. history_finish();
  100. return 0;
  101. }