自己写shell第三天增加quit 命令退出shell特性
1. 增加quit命令退出shell特性
使用fgets来取命令
strcmp来对比命令
很简单的实现,效果:
代码:
/** * 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; } }}