execvp - 使用转义的空格处理arg

时间:2014-04-08 03:08:57

标签: c escaping whitespace args execvp

我制作一个基本的shell,它工作正常,但有一个问题。目前,如果我提供诸如

之类的args
cat 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;

1 个答案:

答案 0 :(得分:1)

args3[1] = "hello\\ world";

应该是

args3[1] = "hello world";

在命令cat hello\ world中,您需要转义“hello”和“word”之间的空格,因为您不希望shell将“hello world”视为两个单词,因此在shell处理命令行参数后正确地说,cat的第一个参数应该是hello world,而不是hello\ world