LinuxC实战—myshell(cd内置命令,重定向,管道,屏蔽ctrl+c,自动补全,移动光标,命令切换,ls自带颜色)

实现屏蔽^c信号,只要这一行代码

 signal(SIGINT,SIG_IGN);

补全功能和移动光标,命令切换____readline库
自动补全这个功能需要用Readline 库 ,没有的话需要安装,至于如何使用readline推荐这篇帖子点一点

		sudo apt-get install libreadline6-dev 

因为readline 是动态链接库 所以 ,编译的时候 需要加上 -lreadline

gcc chengxi -lreadline

要加头文件
#include<readline/readline.h>

实现命令切换

头文件
#include<readline/history.h>

同样,编译的时候也需要加上 -lreadline

    add_history(str);

每次将所读取的命令加到 add_history()中.

完整操作
		memset(buf,0,256);
        print_prompt(); // 打印提示符
        char *str = readline("\033[37mSSX)\033[0m$ ");
        add_history(str);
        strcpy(buf,str);

cd命令,cd -,cd ~,cd path

  if(strncmp(arg[0],"cd",2) == 0){
   
        
        if(argcount == 1){
   
            strcpy(past,aaa);
            chdir("/home/sunxiaochuan/");
            return ;
        }
        if(strncmp(arg[1],"~",1) == 0 || argcount == 1){
   
            strcpy(past,aaa);
            chdir("/home/sunxiaochuan/");
            return ;
        }
        else if(strncmp(arg[1],"-",1) == 0){
   
            if(past[0] == '\0' && past[1] == '\0'){
   
                printf("ERROR: wrong command about cd\n");
                return ;
            }
            else{
   
                if(chdir(past) == -1){
   
                    printf("bash: cd: %s: 没有那个文件或目录\n",arg[1]);
                }
            }
        }
        else if(argcount == 2){
   
            strcpy(past,aaa);
            if(chdir(arg[1]) == -1){
   
                printf("bash: cd: %s: 没有那个文件或目录\n",arg[1]);
            }
        }
        return ;
    }

ls自带颜色
自动检测ls命令,然后加上参数 --color

if(strcmp(arg[0],"ls") == 0){
   
        strcpy(arglist[argcount],"--color");
        arg[argcount] = (char *)arglist[argcount];

        argcount = argcount + 1;
        arg[argcount] = NULL;
    }
    else{
   
        arg[argcount] = NULL;
    }
    
  

主程序代码如下,具体实现注释说的比较清楚

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>     // exit
#include <string.h>
#include <fcntl.h>      // O_RDWR
#include <dirent.h>     // DIR, struct dirent 
#include <sys/wait.h>
#include <wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include<readline/readline.h>
#include<readline/history.h>

#define BUFFSIZE 64
#define normal 0        // 一般的命令
#define out_redirect 1  // 输出重定向
#define outtwo_redirect 4 //>>
#define in_redirect 2   // 输入重定向
#define have_pipe 3     // 命令中有管道

void print_prompt();    // 打印提示符
// 二维数组作为函数参数,第1维长度可以不指定,但必须指定第2维长度
// 也可使用指向含8个元素一维数组的指针,char (*a)[8]
void explain_input(char *, int *, char a[][256]); // 解析输入的命令
void do_cmd(int, char a[][256]);  // 执行命令
int find_command(char *);       // 查找命令中的可执行程序
char aaa[256];
char past[256];

int main(int argc, char *argv[])
{
   
    signal(SIGINT,SIG_IGN);
    char arglist[100][256];
    int argcount = 0;
    char *
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Randy__Lambert

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值