#include <unistd.h>
#include <glob.h>
#include <wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SHELL_VERSION "myshell$"
// 分隔符集合
#define SEPRATE_CHAR_SET " "
void PrintVersion(void)
{
fprintf(stdout,SHELL_VERSION);
}
int DealCmdString(char *cmdString,ssize_t cmdStringLength)
{
if (cmdString == NULL)
{
return(-1);
}
if (cmdStringLength < 1)
{
return(-1);
}
// 处理geline获取的换行符
if ((cmdStringLength == 1) && (cmdString[0] == '\n'))
{
return(-1);
}
cmdString[cmdStringLength - 1] = cmdString[cmdStringLength];
return(0);
}
// strsep(),string seprate
int Parse(char *cmdString,glob_t *pGlobResult)
{
if (cmdString == NULL)
{
return(-1);
}
if (cmdString == NULL)
{
return(-1);
}
char *strRet;
int appendFlag = 0;
for (;;)
{
strRet = strsep(&cmdString,SEPRATE_CHAR_SET);
if (strRet == NULL)
{
return(0);
}
// 第一次无GLOB_APPEND
glob(strRet,GLOB_NOCHECK | (GLOB_APPEND * appendFlag),NULL,pGlobResult);
appendFlag = 1;
}
return(-1);
}
int main(int argc ,char **argv)
{
char *cmdString = NULL;
size_t stringLength = 0;
ssize_t nread;
int intRet;
glob_t globResult;
pid_t childPID;
while (1)
{
PrintVersion();
nread = getline(&cmdString,&stringLength,stdin);
if (nread == -1)
{
fprintf(stderr,"getline error\n");
exit(1);
}
intRet = DealCmdString(cmdString,nread);
if (intRet == -1)
{
continue;
}
intRet = Parse(cmdString,&globResult);
if (intRet == -1)
{
continue;
}
if (0)
{
}
// 继承linux shell环境变量生成子进程
else
{
childPID = fork();
if (childPID < 0)
{
exit(1);
}
else if (childPID == 0)
{
execvp(globResult.gl_pathv[0],globResult.gl_pathv);
fprintf(stderr,"execvp error\n");
exit(1);
}
else
{
wait(NULL);
}
}
}
exit(0);
}
效果: