读书人

自个儿写shell第三天增加quit 命令退出

发布时间: 2013-02-04 10:50:22 作者: rapoo

自己写shell第三天增加quit 命令退出shell特性

1. 增加quit命令退出shell特性

使用fgets来取命令

strcmp来对比命令

很简单的实现,效果:

自个儿写shell第三天增加quit 命令退出shell特性


代码:

/** *  jsh 程序,简单的shell程序 * *  created : jeff *  date:      2013.1.28 *  version:   first version    *       *      modified: jeff *      date    : 2013.1.29 *      version : v1.0 *      reason  : 增加回显功能和显示用户以及当前目录的能力 * *      modified: jeff *      date    : 2013.1.30 *      version : v1.0 *      reason  : 增加quit命令和删除回车符 * * *********************************************/#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <getopt.h>#include <string.h>#define VERSION \  "jsh version 1.0.0\n"\#define MAX_PATH_LENGTH 1024#define MAX_COMMAND_LENGTH 1024#define MAX_USER_LENGTH 128#define QUIT_CMD "quit"#define USAGE\  "Usage: jsh [GNU long option] [option] ...\n\       jsh [GNU long option] [option] script-file ...\n\  long option:\n\           --version\n\           --help\n"\static struct option longOptions[]={  {"version", 0, NULL,'v' },  {"help", 0, NULL, 'h'}};static char user[MAX_USER_LENGTH]={0,};static char currentWorkPath[MAX_PATH_LENGTH]={0,};static char command[MAX_COMMAND_LENGTH]={0,};static void usage();static void version();static void readopt(int argc, char** argv);int main(int argc, char** argv){    int opt = 0;    char* path = NULL;    int getuserret = 0;     if(argc<2)    {    while(1)        {            /**            *显示当前目录和用户            */            if((path=getcwd(currentWorkPath, sizeof(currentWorkPath))) == NULL)                break;                        if( getuserret = getlogin_r(user, sizeof(user)) !=0)                break;            fprintf(stdout, "%s:%s$ ", user, currentWorkPath);                              if(fgets(command, sizeof(command), stdin))            {                int cmdlen=0;                /**                 * 处理命令长度和最后回车符                 *                  */                if( (cmdlen = strlen(command)) >0)                {                    /**                     * 将\n设置成\0                     */                    command[cmdlen-1]='\0';                }else{                    continue;                }                /**                 *增加quit命令可以退出特性                 *                 */                if(strcmp(command, QUIT_CMD) == 0)                  break;                             }else            {                break;            }              }    }else{        readopt(argc, argv);    }    return 0;}static void usage(){   fprintf(stdout, USAGE);}static void version(){   fprintf(stdout, VERSION);}static void readopt(int argc, char** argv){    int opt=0;while( (opt=getopt_long(argc,argv,"vh",longOptions,  NULL)) !=EOF)        {            switch(opt)            {                case 'h':                    usage();                break;                case 'v':                    version();                break;                default:                    usage();                break;            }        }}





读书人网 >编程

热点推荐