带有引号的grep的execvp()

时间:2018-03-20 01:12:47

标签: c shell grep execvp quotation-marks

我在自己的小贝壳里做了'grep'。 其他命令,如'ls -al','pwd'..等,正在运行。 但是当我把'grep'时,有一些问题。

char* f_grep[] = {"grep", "-n", "a", "a.txt", NULL};
char* s_grep[] = {"grep", "-n", "'a'", "a.txt", NULL};

execvp(f_grep[0], f_grep); // This works.

execvp(s_grep[0], s_grep); // This doesn't work.

我想知道为什么我不能在execvp()中使用grep的引号。

谢谢。

1 个答案:

答案 0 :(得分:3)

通常,shell会从命令行参数中删除一级引号。所以,如果你打字,

grep -n 'a' a.txt

没什么不同
grep -n a a.txt

因为shell会删除引号。

但是,当您将带引号的字符串传递给execvp时,不会删除引号。这意味着s_grep的示例与键入

相同
grep -n "'a'" a.txt

shell会删除双引号,并保留单引号,这就是execvp发生的事情。

如果你想试验这个,你需要两个程序。第一个程序(称为" showme")只是回显了它的命令行参数:

// showme.c
int main(int argc, char *argv[])
{
    for (int i = 0; i < argc; i++)
        printf("%d: %s\n", i, argv[i]);
}

第二个程序使用#34; showme&#34;的一些参数调用execvp

int main(void)
{
    char *args[] = { "./showme", "a", "'b'", NULL };
    execvp(args[0], args);
}

输出:

0: ./showme
1: a
2: 'b'