ls | 用C编写的shell中的grep

菲特

我试图用C制作自己的shell。它使用一个管道,并且输入(目前)是静态的。我使用execvp执行命令。一切都很好,除了我运行命令时ls |grep ".c"没有任何结果。谁能告诉我问题出在哪里并找到解决方案。

到目前为止的外壳:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int   p[2];
int pid;
int r;

main()
{
    char *ls[] = {"ls", NULL};
    char *grep[] = {"grep", "\".c\"", NULL};

    pipe(p);

    pid = fork();
    if (pid  != 0) {
            // Parent: Output is to child via pipe[1]

            // Change stdout to pipe[1]
            dup2(p[1], 1);
            close(p[0]);

            r = execvp("ls", ls);
    } else {
            // Child: Input is from pipe[0] and output is via stdout.
            dup2(p[0], 0);
            close(p[1]);

            r = execvp("grep", grep);
            close(p[0]);
    }

    return r;
}
托特

删除grep参数中的引号。即使用

char *grep[] = {"grep", ".c", NULL};

如果您正在调用execvp,则不会发生参数的常规shell扩展(即,globbing,引号的删除等),因此实际上,您在做什么与

ls | grep '".c"'

在普通的外壳中。

另外请注意,调用to之后execvp不会执行任何操作,它将execvp 替换当前进程,它将永远不会返回。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ls与ls -C的区别

来自分类Dev

“ ls | grep zip”与“ grep zip $(ls)”

来自分类Dev

ls -c和ls -t之间的区别

来自分类Dev

用execv调用“ ls”

来自分类Dev

如何使用execvp在c中编写ls命令

来自分类Dev

在C中创建ls命令

来自分类Dev

在C中实现ls命令

来自分类Dev

ls | grep的作品不适用于ls --color

来自分类Dev

与nohup兼容的shell脚本中的ls的替代

来自分类Dev

用ls查找但路径完整

来自分类Dev

排除ls中的某些文件

来自分类Dev

ls中的新行格式

来自分类Dev

Rs中的ls(“ package:datasets”)

来自分类Dev

排除ls中的某些文件

来自分类Dev

ls中的新行格式

来自分类Dev

ls中的未知文件类型

来自分类Dev

ls -lt在Linux中列出

来自分类Dev

bash脚本中的ls问题

来自分类Dev

C execvp将不执行“ ls -l”命令,但将执行“ ls”

来自分类Dev

cd && ls | grep:如何在当前shell中执行命令并传递输出

来自分类Dev

为什么“ ls> ls.out”会导致“ ls.out”包含在名称列表中?

来自分类Dev

用ls管道传输时,solaris中的grep无法正常工作

来自分类Dev

用ls传送时,grep命令在solaris中不起作用

来自分类Dev

在C中实现ls,无限循环

来自分类Dev

在C中实现ls -t选项

来自分类Dev

选项-C在ls输出中实现了什么?

来自分类Dev

管道ls到grep(行与“项目”)

来自分类Dev

管道ls到grep(行与“项目”)

来自分类Dev

带ls -a的grep命令无法正常工作?