我正在编写一个基本shell,我的第一个要求是测试cd,我有可能的cd命令的所有条件,之后,我将处理像ls这样的命令。至于现在,我对一段代码感到困惑。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define MAX_TOK 50
#define MAX_LEN 100
#define BUFSIZE 81
int tokenize(char *cmd, char tokens[MAX_TOK][MAX_LEN]){
char *token;
int NUM_TOKENS = 0;
//printf("Splitting the string \"%s\" into tokens:\n",cmd);
token = strtok(cmd, " ");
while(token != NULL){
strcpy(tokens[NUM_TOKENS],token);
token = strtok(NULL, " ");
NUM_TOKENS++;
}
return NUM_TOKENS;
}
void decide(char tokens[MAX_TOK][MAX_LEN], int NUM_TOKENS){
char *home = getenv("HOME");
int success;
char *cd = {"cd"};
char *string = tokens[1];
//printf("Number of tokens %d\n", NUM_TOKENS);
//printf("%d\n",strcmp(tokens[0], cd));
if(strcmp(tokens[0], cd) == 0){
if(NUM_TOKENS > 2){
printf("error: Too many arguments\n");
}
else{
printf("Changing to new directory %s \n",tokens[1]);
char *string = tokens[0];
//printf("%s\n", tokens[1]);
success = chdir(tokens[1]);
printf("%d\n",success);
}
}
else{
printf("Completing the %s request\n",tokens[0]);
take_action(tokens[0]);
}
}
void take_action(char *cmd){
printf("%s\n",cmd);
int len;
int return_code;
char buffer[BUFSIZE];
int pid;
pid = fork();
if(pid != 0){
//parent process executing
wait(NULL);
}else{
//child process executing
len = strlen(buffer);
if(buffer[len-1] == '\n'){
buffer[len-1] = '\0';
}
return_code = execlp(cmd, cmd, NULL);
if(return_code != 0){
printf("Error executing %s.\n", cmd);
}
}//end else
}
int main(){
char *cmd;
char tokens[MAX_TOK][MAX_LEN];
int len;
int return_code;
char buffer[BUFSIZE];
int pid;
while(cmd != NULL){
printf("Enter a command\n");
cmd = fgets(buffer, BUFSIZE, stdin);
// find the command
int NUM_TOKENS = tokenize(cmd, tokens);
//print_tokens(NUM_TOKENS, tokens);
decide(tokens,NUM_TOKENS);
}
}//end main
当硬编码chdir("test")
代码运行正常时,如果命令行中的用户输入"cd test"
tokens[0]
为cd
而tokens[1]
为字符串{{ 1}}但是"test"
失败了,我不明白为什么。
打印令牌[1]也将“test”显示为存储的字符串。当将参数传递给take_action时,我被告知会发生冲突类型。在两个print语句中都显示了正确的字符串。据我所知,没有额外的空格,因为我的令牌化功能将它们全部剥离。我很困惑,这两个部分看起来很简单但不会工作。
答案 0 :(得分:3)
代码
char *string = tokens[0];
printf("%s\n", tokens[1]);
success = chdir(string);
将转换为
success = chdir("cd");
我想你想要
char *string = tokens[1];
// ^
代替。
答案 1 :(得分:3)
用户未输入cd test
。他输入cd test
然后按Enter键。
这意味着您将拥有:
token[0] = "cd";
token[1] = "test\n";
并且您没有名为"test\n"
的目录,它将是"test"
。您需要在最后一个标记中删除换行符。
e.g。改变主要做
char *tmp;
cmd = fgets(buffer, BUFSIZE, stdin);
if (cmd && (tmp = strrchr(buffer, '\n')) != NULL) {
*tmp = 0;
}
答案 2 :(得分:1)
token[0]
为cd
,token[1]
为path
。所以请使用char* string=token[1]