#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<pwd.h>
#define MAX_ARG 10
char* get_cmd(char buff[],char* myargv[])
{
int i=0;
char* s=strtok(buff," ");
while(s!=NULL)
{
myargv[i++]=s;
s=strtok(NULL," ");
}
return myargv[0];
}
void printf_info()
{
char* s="$";
int uid=getuid();
if(uid==0)
{
s="#";
}
struct passwd * ptr=getpwuid(uid);
if(ptr==NULL)
{
printf("mybash>>$ ");
fflush(stdout);
return;
}
char hostname[128]={0};
gethostname(hostname,128);
char curr_dir[256]={0};
getcwd(curr_dir,256);
printf("\033[1;32m%s@%s\033[0m:\033[1;34m%s\033[0m%s ",ptr->pw_name,hostname,curr_dir,s);
fflush(stdout);
}
int main(int argc,char* argv[],char* envp[])
{
while(1)
{
printf_info();
char buff[128]={0};
fgets(buff,128,stdin);
buff[strlen(buff)-1]='\0';
char* myargv[MAX_ARG]={0};
char* cmd=get_cmd(buff,myargv);
if(cmd[0]==0)
{
continue;
}
else if(strcmp(cmd,"exit")==0)
{
break;
}
else if(strcmp(cmd,"cd")==0)
{
if(myargv[1]!=NULL)
{
if(chdir(myargv[1])!=0)
{
printf("cd err:cd %s\n",myargv[1]);
}
}
}
else
{
pid_t pid=fork();
if(pid==-1)
{
exit(0);
}
if(pid==0)
{
execvp(cmd,myargv);
printf("exec err\n");
exit(0);
}
wait(NULL);
}
}
}
linux实现mybash
于 2024-01-14 21:27:20 首次发布