Linux--自定义shell
shell
shell就操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口,用户可以通过输入命令来执行各种操作,如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。
常见的Unix系统中使用的默认shell是Bash。除了Bash,还有其他一些常见的shell,如 C Shell、Kron Shell 等,它们对于不同的用户需求和习惯提供了不同的特性和语法。
自定义Shell
打印
获取的字符串分割
执行命令
一些问题
内建命令的处理
原码
#include #include #include #include #include #include #define SIZE 1024 #define MAX_ARGC 64 #define SEP " " char *argv[MAX_ARGC]; char pwd[SIZE]; char env[SIZE]; // for test int 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; //'' 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; }
相关阅读:
1、Linux系统的版本大全,从主流发行版到小众选择,Linux系统版本太多挑花眼?这份主流到小众的终极指南帮你选对!,Linux系统版本太多挑花眼?这份主流到小众的终极指南帮你选对!
2、如何在Linux系统中创建和运行Shell脚本文件,如何在Linux中轻松创建并运行Shell脚本?,想在Linux中一键搞定Shell脚本?这个方法太简单了!
3、Linux理论,从操作系统基础到开源哲学,想从零掌握Linux?操作系统基础与开源哲学如何帮你成为高手?,从零掌握Linux,操作系统基础与开源哲学如何成就你的高手之路?
4、LAMMPS在Linux系统上的安装与配置指南,如何在Linux系统上轻松安装和配置LAMMPS?,想在Linux上快速搞定LAMMPS?这份指南让你10分钟轻松完成安装配置!
5、Linux 下安装 Python 和 pip 的完整指南,如何在 Linux 系统上轻松安装 Python 和 pip?,想在Linux上快速安装Python和pip?这篇指南让你1分钟搞定!
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!