📄 shell.c
字号:
#include<stdio.h>#include<stdlib.h>#include<curses.h>#include<fcntl.h>#include<string.h>#include<signal.h>#define ONECOL 25#define MAXITEM 20struct operation{ char title[80]; char command[80];};char *RP,*user,*devname,*TTY;char p[20];main(int argc,char *argv[]){ struct operation op[MAXITEM]; int choice; user=getenv("IF"); sprintf(p,"/cx/etc/income.ini"); TTY=getenv("TTYNAME"); devname=(char *)ttyname(0); if(!strcmp(user,p)) { if(strcmp(devname,TTY)) { printf("你不是合法用户!\n"); printf("你不是合法用户!\n"); printf("你不是合法用户!\n"); exit(1); } } RP=getenv("ROOTPATH"); if(RP==NULL) { printf("\n\r环境变量'ROOTPATH'未初始化!\0x7\0x7\n\r"); return -1; } signal(SIGINT,SIG_IGN); initscr(); raw(); nonl(); noecho(); refresh(); while((choice=menu(op))!=-1) execute(op,choice); erase(); refresh(); endwin();}int menu(struct operation op[]){ FILE *fp; char fn[80],s[80],head[80],command[80]; int nop,i; char ch; int firstl; char prompt[]="请选择('Q'退出): "; char *IF; IF=getenv("IF"); if(IF==NULL) { printf("\n\r环境变量'IF'未初始化!\n\r"); return -1; } strcpy(fn,IF); fp=fopen(fn,"r"); if(fp==NULL) { sprintf(s,"文件 %s 打开失败!",fn); showmsg(s); getch(); refresh(); return -1; } fgets(head,80,fp); for(nop=0;nop<MAXITEM;nop++) if(fscanf(fp,"%s%s",op[nop].title,op[nop].command)==EOF) break; else if(op[nop].command[0]!='/') { sprintf(command,"%s/%s",RP,op[nop].command); strcpy(op[nop].command,command); } fclose(fp); firstl=(23-nop)/2; showhead(firstl,head); for(i=0;i<nop;i++) { if(i>=9) ch='a'+i-9; else ch='1'+i; sprintf(s,"%c. %s",ch,op[i].title); mvaddstr(firstl+i,ONECOL,s); } mvaddstr(nop+firstl,ONECOL-5,"--------------------------"); mvaddstr(nop+firstl+1,ONECOL,prompt); refresh(); while(1) { move(nop+firstl+1,ONECOL+strlen(prompt)); clrtoeol(); refresh(); ch=getch(); refresh(); if(ch=='q'||ch=='Q') return -1; if(ch>='1'&&ch<='9'&&(ch-'1')<nop) return ch-'1'; if(ch>='a'&&ch<='z'&&(ch-'a'+9)<nop) return ch-'a'+9; if(ch>='A'&&ch<='Z'&&(ch-'A'+9)<nop) return ch-'A'+9; printf("\07\07"); }}showhead(int firstl,char *s){ mvaddstr(firstl-2,ONECOL+3,s); mvaddstr(firstl-1,ONECOL-5,"--------------------------"); refresh();}int execute(struct operation *op,int choice){ int status; erase(); refresh(); endwin(); if(fork()==0) execl(op[choice].command,op[choice].command,NULL); wait(&status); initscr(); raw(); nonl(); noecho(); refresh();}showmsg(char s[]){ move(23,0); clrtoeol(); mvaddstr(23,40-strlen(s)/2,s); refresh();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -