带有引号的 grep 的 execvp()
execvp() with grep that has quotation marks
我在自己的小 shell 中做了 '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 使用引号。
谢谢。
通常,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'
我在自己的小 shell 中做了 '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 使用引号。
谢谢。
通常,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'