#include
#include
#include
#include
#include
#define length 80
#define MAX 80
char **p=NULL,*p1[MAX]={NULL};
void strtok_hostname() //对提示符的处理
{
char s1[80],s2[80],s3[80],s4[80];
char *hostname;
char *ttp=getenv("HOME");
int i,j,k=0;
printf("[%s@",getenv("USER")); //打印当前用户
hostname = getenv("HOSTNAME");
if (hostname)
strcpy(s1,hostname); //若为空,则s1为空
else
strcpy(s1,"localhost"); //否则s1为Loalhost
strcpy(s2,getcwd(NULL,length)); //s2获取当前路径
for(i=0;s1[i]!='.'&&s1[i]!='\0';i++)
{
printf("%c",s1[i]); //当HOSTNAME遇到‘.’时截取并打印
}
printf(":"); //用于跟操作系统提示符区别开来
if (strcmp(s2,"/")==0) //若路径为‘/’时。打印该路径
{
printf("/");
}
else if (strcmp(s2,ttp)==0) //否则若为root时,用‘~’来表示root
{
printf("~");
}
else
{
j = strlen(s2);
while(s2[j--]!='/'); //扫描路径,遇到‘/’时截取
printf("%s",&s2[j+2]);
}
printf("]#");
}
int strtok_order()
{
char s[100];
int w[100];
int cnt=1,n=0,m=0,flag=1;
int j,i;
int wn=0,len;
char * strtok(char *s, const char *delim);
char *q,*g;
char *d=";" , *delim=" ";
fgets(s,100,stdin);
for(i=0;s[i] != '\0';i++) //为了计算输入命令的条数,这样方便分配空间的个数
{
if(s[i] == ';' && s[i+1] != '\n' ) //
{
cnt++;
}
}
printf("%d\n",cnt); //除分号以外的单词个数
p= (char **) malloc (cnt * sizeof(char *)); //申请二维空间**p
for(i=0;i<cnt;i++)
{
p[i]=(char *) malloc (4*sizeof(char));
}
q=strtok(s,d); //为了删除分号
for(i=0;i<cnt;i++) //把以空格截取的命令拷贝到p[i]中
{
if(q!=NULL)
{
strcpy(p[i],q);
q=strtok(NULL,d);
}
printf("p[%d]=%s\n",i,p[i]);
}
for(i=0;i<cnt;i++)
{
p1[n]=strtok(p[i],delim);//删除空格
//n=0;
while(p1[n]!=NULL)
{
n++;
p1[n]=strtok(NULL,delim);
}
}
printf("%d\n",n);
for(j=0;j<n;j++)
{
printf("p1[%d]=%s\n",j,p1[j]);
}
return n ;
}
char *oldpath="./"; //默认初始化为当前目录
void cd_return() //实现cd -
{
char *newpath;
newpath=getcwd(NULL,225);//获取当期路径
chdir(oldpath); //切换到上一次访问的路径
oldpath=newpath; //把当期路径保存成上一次访问的路径
printf("cd_return\n");
}
void cd_filename() // 实现cd + filename
{
int i=0;
oldpath=getcwd(NULL,225);//保存当期的路径作为上一次访问的路径
chdir(p1[i+1]); //切换到filename
printf("cd_filename\n");
}
void cd_nothing() //仅实现cd
{
char *ttp;
oldpath=getcwd(NULL,225);//保存当期的路径作为上一次访问的路径
ttp=getenv("HOME"); //到HOME目录
chdir(ttp); //回到root下
printf("cd_nothing\n");
}
void order()
{
char *str=NULL;
int i;
int status;
int cnt=strtok_order();//单词总个数
for(i=0;i<cnt;i++)
{
if((strcmp(p1[i],"cd")==0))
{
if((i+1)<cnt)
{
//printf("if i<cnt\n");
if((strcmp(p1[i+1],"-")==0))// cd -
{
cd_return();
printf("cd -\n");
}
else // cd dir
{
cd_filename();
printf("cd name\n");
}
}
else / nothing
{
cd_nothing();
printf("cd nothing\n");
}
}
else if(strcmp(p1[i],"exit")==0)
{
printf("p111111111111111111[0]=%s\n",p1[0]);
exit(0);
}
else //其他都为外部命令
{
if(fork()==0)
{
execvp(p1[0],p1);
exit(0);
}
printf("p111111111111111111[0]=%s\n",p1[0]);
wait(&status);
// i=cnt;
}
}
}
int main(int argc, char *argv[])
{
int cnt ;
while(1)
{
cnt=1;
strtok_hostname();//提示符
order(); //对命令的操作
}
return 0;
}