mybash.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <pwd.h>
#include <sys/utsname.h>

#define SIZE 20

int count=0;
char *cmdArr[SIZE]={NULL};
char OLDPWD[128]={0};

void out_flag()
{
 char path[128]={0};
 if(NULL==getcwd(path,128))
 {
  printf("getcwd error!\n");
  return;
 }

 char dir[128]={0};
 char *p=strtok(NULL,"/");
 while(p!=NULL)
 {
  strcpy(dir,p);
  p=strtok(NULL,"/");
 }

 if(strlen(dir)==0)
 {
 
  strcpy(dir,"/");
 }
 
 struct passwd *pw=getpwuid(getuid());
 if(pw==NULL)
 {
  printf("error!\n");
  return;
 }

 if(strcmp(pw->pw_dir,getcwd(path,128))==0)
 {
  memset(dir,0,128);
  strcpy(dir,"~");
 }
 
 struct utsname host;
 uname(&host);

 char *hname=strtok(host.nodename,".");
 if(hname==NULL)
 {
  printf("error\n");
  return;
 }

 char flag='$';

 if(pw->pw_uid==0)
 {
  flag='#';
 }

 printf("[%s@%s %s]%c ",pw->pw_name,hname,dir,flag);

 fflush(stdout);
}
void cut_cmd(char *cmd)
{
 count=0;
 memset(cmdArr,0,SIZE*sizeof(cmdArr[0]));

 char *p=strtok(cmd," ");
 while(p!=NULL)
 {
  cmdArr[count++]=p;
  p=strtok(NULL," ");
 }
}
void my_cd()
{
 char nowpwd[128]={0};
 getcwd(nowpwd,128);

 if(cmdArr[1]==NULL||strncmp(cmdArr[1],"~",1)==0)
 {
  struct passwd *pw=getpwuid(getuid());

  if(chdir(pw->pw_dir)==-1)
  {
   perror(pw->pw_dir);
   return;
  }
 }
 
 else  if(strncmp(cmdArr[1],"-",1)==0)
 {
  if(strlen(OLDPWD)==0)
  {
   printf("OLDPWD not set\n");
   return;
  }
  printf("%s\n",OLDPWD);
  if(chdir(OLDPWD)==-1)
  {
   perror(OLDPWD);
   return;
  }
 }
 else
 {
  if(chdir(cmdArr[1]==-1))
  {
   perror(cmdArr[1]);
   return;
  }
 }
 strcpy(OLDPWD,nowpwd);

}

 

int main(int argc,char *argv[])
{
 signal(SIGINT,SIG_IGN);
 while(1)
 {
  out_flag();
  char cmd[128]={0};
  fgets(cmd,128,stdin);
  cmd[strlen(cmd)-1]=0;

  if(strlen(cmd)==0)
  {
   continue;
  }
  cut_cmd(cmd);

  if(cmdArr[0]==NULL)
  {
   continue;
  }
  if(strncmp(cmdArr[0],"cd",2)==0)
  {
 
   my_cd();
   continue;
  }
  if(strncmp(cmdArr[0],"exit",4)==0)
  {
   exit(0);
  }

/*----------------------------------------------------------------*/

  pid_t pid=fork();
  assert(pid!=-1);
 
  if(pid==0)
  {
   char path[128]="/home/yqy/Desktop/shell/shell/mybin";
   strcat(path,cmdArr[0]);
   execv(path,cmdArr);
   printf("program:%s:command not found\n",(cmdArr[0]));
  }
  else
  {
   wait(NULL);
  }
 }
 return 0;
}

转载于:https://my.oschina.net/u/3709716/blog/1570399

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值