我制作一个基本的shell,它工作正常,但有一个问题。目前,如果我提供诸如
之类的argscat testtextfile
execvp命令工作正常。但是,如果我提供类似
的内容cat hello\ world
即。如果名称中包含空格的文件,该命令将不起作用。如何让execvp理解这种args。
以下是我的代码的摘录,如果我将args3 [1]更改为类似" -n"
之类的内容,它会起作用。char *args3[3];
args3[0] = "cat";
args3[1] = "hello\\ world";
args3[2] = NULL;
if ((child = fork()) == 0) { //child
printf("pid of child = %ld\n", (long) getpid());
execvp(args3[0], args3); //arg[0] is the command
fprintf(stderr, "execvp failed \n");
exit(1);
} else { //parent
if (child == (pid_t)(-1)) {
fprintf(stderr, "fork failed.\n"); exit(1);
} else {
if (doNotWait == 0){
c = wait(&cstatus); //wait for child
printf("child %ld exited with status = %d\n",
(long) c, cstatus);
} else {
printf("not waiting for child process\n");
}
}
}
return 0;
答案 0 :(得分:1)
args3[1] = "hello\\ world";
应该是
args3[1] = "hello world";
在命令cat hello\ world
中,您需要转义“hello”和“word”之间的空格,因为您不希望shell将“hello world”视为两个单词,因此在shell处理命令行参数后正确地说,cat
的第一个参数应该是hello world
,而不是hello\ world
。