一、什么是shell
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
——《百度百科》
shell命令编辑器更多地用于unix/linux系统之中。
二、节选程序
int main()
{
/****************************声明程序中用到的函数*****************************/
int redirect(); /*重定向命令的处理函数*/
int pipel(); /*管道命令的处理函数*/
int get_line(); /*读取一行的函数*/
int is_founded(); /*查找命令的函数*/
void init_environ(); /*初始化环境变量的函数*/
void getenviron(); /*初始化查找路径的函数*/
void add_history(const char *string);/*调用上下方向键实现history命令的函数*/
void add_his_link(); /*记录history命令的函数*/
void history_cmd(); /*显示history命令的函数*/
void cd_cmd(); /*处理cd命令的函数*/
void jobs_cmd(); /*处理jobs命令的函数*/
void add_node(); /*向jobs命令的链表中增加节点函数*/
void del_node(); /*向jobs命令的链表中删除节点函数*/
void ctrl_z(); /*处理用户按下ctrl_z时的函数*/
void setflag(); /*将标志位置一的函数*/
void bg_cmd(); /*处理bg命令的函数*/
void fg_cmd(); /*处理fg命令的函数*/
init_environ(); /*初始化环境变量,将查找路径至于envpath[]中,
//初始化history,和jobs的头尾指针*/
while (1)
{
char c,*arg[20];
char hostName[60],path_string[40];
int i=0,j=0,k=0,is_pr=0,is_bg=0,input_len=0,path,pid=0,status=0,is_addpre=0,is_exe=0,is_absolute=0;
/**************************** 设置signal信号 *****************************/
struct sigaction action;//sigaction()函数用于改变进程接收到特定信号后的行为
action.sa_sigaction=del_node;//指向“新式”信号处理函数的指针
sigfillset(&action.sa_mask);//sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号集搁置
action.sa_flags=SA_SIGINFO;//sa_flags置为SA_SIGINFO(使用新式
sigaction(SIGCHLD,&action,NULL);
signal(SIGTSTP,ctrl_z);
/**************************** 打印提示符 *****************************/
path=get_current_dir_name();//获得当前路径名
gethostname(hostName,sizeof(hostName));//gethostname() : 返回本地主机的标准主机名
sprintf(path_string,"%s",path); //path路径
strcat(hostName,"@");
strcat(hostName,path_string);
strcat(hostName,"#"); //近似构成linux下的shell提示符
char * p =readline(hostName); //使用readline实现tab补全
if(strlen(p)==0)
continue;//当字符串p的长度为0时,即用户只是按下回车键,并没有输入任何字符,因此不需要对后面的操作进行处理
add_history(p); //调用<readline/history.h>头文件中的add_history函数实现上下方向键的history命令
/*******