Step 5:shell的提示行显示 [myshell_project]

  • 为了让用户实时的清楚自己的状态, 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;
        }
}

显示效果

输出结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值