- 为了让用户实时的清楚自己的状态, shell需要实时的显示用户的一些基本信息,包括
shell name
user name
user local
user level
show框架
- 首先,我们需要一个字符串数组来储存我们的位置,并在
show()
中进行处理,其来源于主函数(while(1)中的定义。[[Step 1:MSH框架]] - 其次,在每次循环的结束都要对folders进行刷新,确保返回上级目录的时候不会出错。
void reflush(char** folders){ //刷新folders中的文件名 for (int i = 0; i < 20; i++){ folders[i]=NULL; } }
分割文件名
- 为了实现在主目录下显示
~
,我们需要对命令进行分割,其原理和get_Cmd()
函数相同[[Step 1:MSH框架]]char local[BUFF_SIZE];//获取当前位置 getcwd(local,BUFF_SIZE); //分割文件名 char *s; int num=0; s=strtok(local,"/"); while(s){ folders[num++]=s; s = strtok(NULL,"/"); }
判断root
- 若当前为用户为root则需要进行区分显示,判断方法是通过
getuid()
函数,root的uid为0
获取用户名
- 对于用户名,我们可以使用
getpwuid()
来获得一个passwd结构体:strcut passwd { char *pw_name; char *pw_passwd; uid_t pw_uid; gid_t pw_gid; char *pw_gecos; char *pw_dir; char *pw_shell; }
- 可见,我们只需要获取pw_name即可。
- 而
getpwuid()
需要输入当户的uid,所以,我们只需要在里面输入getuid()
即可username=getpwuid(getuid())->pw_name);
判断位置是否在主目录
- 主目录的位置是
/home/<usename>/
,所以我们只用判断在分割目录时,num
的大小是否大于一即可。//判断位置是非在用户名下 if(num>1){ while(strcmp(folders[nums],getpwuid(getuid())->pw_name)!=0){ nums++; } nums++; printf("~"); }else if(num==0){ printf("/"); }
颜色打印
- 通过不同的转义字符宏定义,进行文字颜色的不同处理,如:
PRINT_FONT_YEL PRINT_END
- 详见[[Step 4:字符颜色]]
文件名打印
- 最后,通过循环打印出路径
//打印文件名 while(folders[nums]!=NULL){ printf("/%s",folders[nums]); nums++; } PRIN
完整代码
char** show(char** folders){
//打印每一个命令行提示
char local[BUFF_SIZE];//获取当前位置
getcwd(local,BUFF_SIZE);
//分割文件名
char *s;
int num=0;
s=strtok(local,"/");
while(s){
folders[num++]=s;
s = strtok(NULL,"/");
}
if(getuid()){//判断是否为root root的uid为0
printf("\n");
printf("MSH@");//msh提示符
//打印主机名
PRINT_FONT_YEL
printf("%s",getpwuid(getuid())->pw_name);
PRINT_END
printf(" in ");
//打印当前位置,若当前位置在用户名下,则用~代替
PRINT_FONT_PUR
int nums=0;
//判断位置是非在用户名下
if(num>1){
while(strcmp(folders[nums],getpwuid(getuid())->pw_name)!=0){
nums++;
}
nums++;
printf("~");
}else if(num==0){
printf("/");
}
//打印文件名
while(folders[nums]!=NULL){
printf("/%s",folders[nums]);
nums++;
}
PRINT_END
printf(" by $\n");
}
return folders;
}
void reflush(char** folders){
//刷新folders中的文件名
for (int i = 0; i < 20; i++){
folders[i]=NULL;
}
}