我正在构建一个 Linux Shell,我目前的头痛是将命令行参数传递给分叉/执行的程序和系统函数。
目前,所有输入都在全局变量 char * parsed_arguments 中以空格和换行符标记。例如,输入目录 /usa/folderb将被标记为:
parsed_arguments[0] = dir
parsed_arguments[1] = /usa/folderb
parsed_arguments 完美地标记了一切;我现在的问题是我希望只获取 parsed_arguments 的一个子集,它不包括要在 shell 中运行的可执行文件的命令/第一个参数/路径,并将它们存储在一个名为 pass_arguments 的新数组中。
所以在前面的例子中dir /usa/folderb
parsed_arguments[0] = dir
parsed_arguments[1] = /usa/folderb
passed_arguments[0] = /usa/folderb
passed_arguments[1] = etc....
目前我对此没有任何运气,所以我希望有人可以帮助我。这是我到目前为止工作的一些代码:
我如何尝试复制参数:
void command_Line()
{
int i = 1;
for(i;parsed_arguments[i]!=NULL;i++)
printf("%s",parsed_arguments[i]);
}
读取命令的功能:
void readCommand(char newcommand[]){
printf("readCommand: %s\n", newcommand);
//parsed_arguments = (char* malloc(MAX_ARGS));
// strcpy(newcommand,inputstring);
parsed = parsed_arguments;
*parsed++ = strtok(newcommand,SEPARATORS); // tokenize input
while ((*parsed++ = strtok(NULL,SEPARATORS)))
//printf("test1\n"); // last entry will be NULL
//passed_arguments=parsed_arguments[1];
if(parsed[0]){
char *initial_command =parsed[0];
parsed= parsed_arguments;
while (*parsed) fprintf(stdout,"%s\n ",*parsed++);
// free (parsed);
// free(parsed_arguments);
}//end of if
command_Line();
}//end of ReadCommand
分叉功能:
else if(strstr(parsed_arguments[0],"./")!=NULL)
{
int pid;
switch(pid=fork()){
case -1:
printf("Fork error, aborting\n");
abort();
case 0:
execv(parsed_arguments[0],passed_arguments);
}
}
这是我的外壳当前输出的内容。我第一次运行它时,它会输出一些接近我想要的东西,但每次后续调用都会破坏程序。此外,每个额外的调用都会将解析的参数附加到输出中。
这是原始外壳产生的。再次接近我想要的,但不完全。我想省略命令(即“./testline”)。