当前位置:首页 » 《随便一记》 » 正文

Linux--自定义shell

0 人参与  2024年03月03日 15:06  分类 : 《随便一记》  评论

点击全文阅读


shell

shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口,用户可以通过输入命令来执行各种操作,如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。

常见的Unix系统中使用的默认shell是Bash。除了Bash,还有其他一些常见的shell,如 C Shell、Kron Shell 等,它们对于不同的用户需求和习惯提供了不同的特性和语法。

自定义Shell

打印

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取的字符串分割

在这里插入图片描述
在这里插入图片描述

执行命令

在这里插入图片描述
在这里插入图片描述

一些问题

在这里插入图片描述

在这里插入图片描述

内建命令的处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原码

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>#define SIZE 1024#define MAX_ARGC 64#define SEP " "    char *argv[MAX_ARGC];char pwd[SIZE];char env[SIZE]; // for testint lastcode = 0;const char* HostName(){    char *hostname = getenv("HOSTNAME");    if(hostname) return hostname;    else return "None";}const char* UserName(){    char *hostname = getenv("USER");    if(hostname) return hostname;    else return "None";}const char *CurrentWorkDir(){    char *hostname = getenv("PWD");    if(hostname) return hostname;    else return "None";}char *Home(){    return getenv("HOME");}int Interactive(char out[], int size){    // 输出提示符并获取用户输入的命令字符串"ls -a -l"    printf("[%s@%s %s]$ ", UserName(), HostName(), CurrentWorkDir());    fgets(out, size, stdin);    out[strlen(out)-1] = 0; //'\0'    return strlen(out);}void Split(char in[]){    int i = 0;    argv[i++] = strtok(in, SEP); // "ls -a -l"    while(argv[i++] = strtok(NULL, SEP));     if(strcmp(argv[0], "ls") ==0)    {        argv[i-1] = (char*)"--color";        argv[i] = NULL;    }}void Execute(){    pid_t id = fork();    if(id == 0)    {        // 让子进程执行命名        execvp(argv[0], argv);        exit(1);    }    int status = 0;    pid_t rid = waitpid(id, &status, 0);    if(rid == id) lastcode = WEXITSTATUS(status);     //printf("run done, rid: %d\n", rid);}int BuildinCmd(){    int ret = 0;    // 1. 检测是否是内建命令, 是 1, 否 0    if(strcmp("cd", argv[0]) == 0)    {        // 2. 执行        ret = 1;        char *target = argv[1]; //cd XXX or cd        if(!target) target = Home();        chdir(target);        char temp[1024];        getcwd(temp, 1024);        snprintf(pwd, SIZE, "PWD=%s", temp);        putenv(pwd);    }    else if(strcmp("export", argv[0]) == 0)    {        ret = 1;        if(argv[1])        {            strcpy(env, argv[1]);            putenv(env);        }    }    else if(strcmp("echo", argv[0]) == 0)    {        ret = 1;        if(argv[1] == NULL) {            printf("\n");        }        else{            if(argv[1][0] == '$')            {                if(argv[1][1] == '?')                {                    printf("%d\n", lastcode);                    lastcode = 0;                }                else{                    char *e = getenv(argv[1]+1);                    if(e) printf("%s\n", e);                }            }            else{                printf("%s\n", argv[1]);            }        }    }    return ret;}int main(){    while(1)    {        char commandline[SIZE];        // 1. 打印命令行提示符,获取用户输入的命令字符串        int n = Interactive(commandline, SIZE);        if(n == 0) continue;        // 2. 对命令行字符串进行切割        Split(commandline);        // 3. 处理内建命令        n = BuildinCmd();        if(n) continue;        // 4. 执行这个命令        Execute();    }      return 0;}

点击全文阅读


本文链接:http://zhangshiyu.com/post/73104.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1