【问题标题】:execvp() with grep that has quotation marks带有带引号的 grep 的 execvp()
【发布时间】:2018-08-28 17:12:37
【问题描述】:

我在自己的小 shell 中执行了“grep”。 其他命令,如 'ls -al'、'pwd' ..etc,正在工作。 但是当我输入 '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 使用引号。

谢谢。

【问题讨论】:

  • “不起作用”是什么意思?它工作得很好——它找到了三个字符的字符串'a',就像它应该做的那样。
  • @CharlesDuffy 谢谢!!现在我可以理解我做错了什么。非常感谢。

标签: c shell grep execvp quotation-marks


【解决方案1】:

通常,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]);
}

第二个程序调用execvp,并带有一些“showme”的参数:

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

输出:

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

【讨论】:

  • 非常感谢。我完全理解你说的话。谢谢。
  • @Jason 如果此答案解决了问题,请考虑勾选答案旁边的绿色复选框。
  • @bishop 谢谢。这是我的第一个问题,所以我不知道。祝你有美好的一天!
猜你喜欢
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多