我有一个模拟shell,具有运行bash文件的能力,需要shell支持!!,echo和exit,这就是我到目前为止所做的:
void run_file(char* file){
int i;
char* echo = "echo";
char* ex = "exit";
char* prev_f = (char*)malloc(sizeof(char)*MAX_CMD_BUFFER);
char* nline = "\n";
char* bang = "!!";
char check[5];
char c_bang[3];
char c_nline[2];
c_nline[1] = '\0';
FILE *fp = fopen(file, "r");
char line[MAX_CMD_BUFFER];
size_t len = 0;
ssize_t read;
if (fp == NULL)
exit(EXIT_FAILURE);
while((read = getline(&line, &len, fp)) != -1){
for(i = 0; i < 4; i++){
check[i] = line[i];
if(i < 2){
c_bang[i] = line[i];
}
}
c_nline[0]=line[0];
check[4] = '\0';
c_bang[3] = '\0';
if(strcmp(c_nline, nline) == 0){continue;}
else if(strcmp(check, echo) == 0){
i = 5;
if (line[5] =='\n')
{
continue;
}
while(line[i] != '\n'){
printf("%c", line[i]);
i++;
}
strcpy(prev_f, line);
}
else if(strcmp(c_bang, bang) == 0){
if(*prev_f == NULL){continue;}
i = 0;
for(i = 0; i < 4; i++){
check[i] = prev_f[i];
}
check[4] = '\0';
if(strcmp(check, echo) == 0){
i = 5;
if (prev_f[5] == '\n'){
continue;
}
while(prev_f[i] != '\n'){
printf("%c", prev_f[i]);
i++;
}
}
else if(strcmp(check, ex) == 0){
char val[3];
for(i = 5; i < 8; i++){
val[i - 5] = prev_f[i];
}
int v = atoi(val);
if(v > 255){v = 255;}
printf("bye!\n");
exit(v);
}
else{
printf("invalid previous command");
}
}
else if(strcmp(check, ex) == 0){
char val[3];
for(i = 5; i < 8; i++){
val[i - 5] = line[i];
}
int v = atoi(val);
if(v > 255){v = 255;}
printf("$ echo $?\n");
printf("%d\n$", v);
strcpy(prev_f, line);
exit(v);
}
}
fclose(fp);
free(prev_f);
}
然而,getline()
没有正确存储该行的数据,因此我无法正确运行命令.有什么方法可以克服这个问题吗?或者我需要手动将文件读取到缓冲区,然后查看缓冲区中有什么命令?
我不知道有什么简单的替代办法/解决办法
谢谢