gpt4 book ai didi

c - 带有引号的 grep 的 execvp()

转载 作者:行者123 更新时间:2023-12-03 18:27:19 25 4
gpt4 key购买 nike

我在自己的小 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);//这行得通。

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'

关于c - 带有引号的 grep 的 execvp(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49374892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com