myshell.txt

来自「这是一个shell的实现程序。其中System的实现参考了linux的。不好意思」· 文本 代码 · 共 83 行

TXT
83
字号
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>

char parsecmd(char *);
/************?????********************************************
*filename:?C??????Linux????shell??
*purpose:???C????????????logout cd ls pwd pid rm mkdir mv cp???
*wrote by: zhoulifa(zhoulifa@163.com)
Linux??? Linux????? SOHO? ??? ???C????
*date time:2006-07-16 15:00:00
*Note: ??????????????????,??????????
* ????GPL?
*Hope:???????????????,?????????
*********************************************************************/
int main(int argc, char ** argv)
{
  char cmd[1024];
  char tmp[101];
  char b = 'F';
  char * p;

  while(1) {
    memset(cmd, 0, 1024);
    printf("Next command%% ");/*??????*/
    fgets(cmd, 1000, stdin);/*??????,????1000???*/
    cmd[strlen(cmd) - 1] = 0;/*????????*/

    b = parsecmd(cmd);/*?????????*/

    if(b=='T') break;/*???logout?????*/

    switch(b){
    case 1:/*??????*/
      if(chdir(cmd + 3) != 0) {
        printf("chdir(%s) error!%s\n", cmd + 3, strerror(errno));
      }
      printf("I'm working in '%s' now\n", getcwd(tmp, 100));
      break;
    case 2:/*ls??*/
    case 7:/*cp??*/
    case 8:/*pwd??*/
      system(cmd);
      break;
    case 3:/*pid??*/
      printf("%d\n", getpid());
      break;
    case 4:/*rm??*/
      remove(cmd + 3);
      break;
    case 5:/*mkdir??*/
      mkdir(cmd + 6, 0755);
      break;
    case 6:/*mv??*/
      p = strchr(cmd + 3, ' ');
      *p = 0;
      rename(cmd + 3, p + 1);
      break;
    case 0:/*???????*/
      printf("Bad command, try again! All aviable commands are:\nlogout cd ls pwd pid rm mkdir mv cp\n", getpid());
      break;
    }
  }
}

char parsecmd(char * s)
{
  if(!strcasecmp(s, "logout")) return 'T';
  else if(!strncasecmp(s, "cd", 2)) return 1;
  else if(!strncasecmp(s, "ls", 2)) return 2;
  else if(!strncasecmp(s, "pwd", 3)) return 8;
  else if(!strncasecmp(s, "pid", 3)) return 3;
  else if(!strncasecmp(s, "rm", 2)) return 4;
  else if(!strncasecmp(s, "mkdir", 5)) return 5;
  else if(!strncasecmp(s, "mv", 2)) return 6;
  else if(!strncasecmp(s, "cp", 2)) return 7;
  else return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?