前言:
Shell(外壳)是一个操作系统的用户界面,它提供了一种方式,使得用户能够与操作系统进行交互。Shell 是用户与操作系统之间的桥梁,允许用户通过命令行输入来执行各种操作,例如文件管理、程序执行、进程控制、系统监控等
常见的 Shell 类型:
Bash(Bourne Again Shell)
:- 是 Linux 和 macOS 等类 Unix 系统中常见的默认 Shell。它是 Bourne Shell 的增强版,支持丰富的特性,如命令补全、历史命令、数组等。
Zsh(Z Shell)
:- 是一个功能强大的 Shell,支持更丰富的自动化、命令补全、插件系统等特性。Zsh 常常被认为是最为用户友好的 Shell 之一。
Fish(Friendly Interactive Shell
):- 是一个具有用户友好界面和丰富特性(如自动提示、自动补全等)的现代 Shell。其设计注重简洁和易用性。
C Shell(csh)
:- 基于 C 语言语法的 Shell,主要用于早期的 Unix 系统。C Shell 提供了较强的脚本编程功能。
Korn Shell(ksh)
:- 是一个功能强大的 Shell,结合了 Bourne Shell 和 C Shell 的特性,并且提供了很多增强的功能。
shell外壳的实现
引入头文件
#include<string>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<assert.h>
-
#include<string>
:引入 C++ 的string
库,用于字符串处理。 -
#include<unistd.h>
:提供访问系统调用的接口,例如fork()
、execvp()
、getcwd()
等。 -
#include<sys/wait.h>
:包含等待子进程退出的函数。 -
#include<sys/types.h>
:包含系统数据类型的定义,如pid_t
(进程 ID 类型)。 -
#include<stdlib.h>
:提供一些标准库函数,如exit()
、getenv()
和putenv()
等。 -
#include<stdio.h>
:提供输入输出函数,如printf()
。 -
#include<string.h>
:提供字符串操作函数,如strtok()
、strcmp()
等。 -
#include<assert.h>
:提供调试宏assert()
,用于检测程序中的错误
宏定义
#define DELIM " \t"
#define LEFT "["
#define RIGHT "]"
#define LABLE "$"
#define LINE_SIZE 1024
#define ARGC_SIZE 32
#define EXIT_CODE 4
-
DELIM
:命令行参数的分隔符,包含空格和制表符。 -
LEFT
,RIGHT
,LABLE
:格式化命令行提示符的符号,用于显示用户、主机和当前工作目录。 -
LINE_SIZE
:最大命令行字符长度,设置为1024。 -
ARGC_SIZE
:最大命令行参数数量,设置为32。 -
EXIT_CODE
:用于退出的错误代码。
全局变量
int quit = 0;
int LASTCODE = 0;
char* argv[ARGC_SIZE];
char commondline[LINE_SIZE];
char pwd[ARGC_SIZE];
char myenv[ARGC_SIZE];
-
quit
:控制程序是否退出的标志。 -
LASTCODE
:记录上一个命令的退出状态码。 -
argv
:存储命令行解析后的参数。 -
commondline
:存储输入的命令行字符串。 -
pwd
:存储当前工作目录路径。 -
myenv
:存储环境变量。
const char* getusr()
{
return getenv("USER");
}
const char* gethostname()
{
return getenv("HOSTNAME");
}
getusr
:返回当前用户的用户名。gethostname
:返回当前计算机的主机名。
获取当前工作目录
void getpwd()
{
getcwd(pwd, sizeof(pwd));
}
getpwd
:调用getcwd
获取当前工作目录,并将结果存储在pwd
中。
交互式输入处理
void ineract(char* cline, int size)
{
getpwd();</