如何使用C程序中的选项运行'ls'?

时间:2016-07-09 17:31:59

标签: shell c

我想在Linux机器上使用ls -a执行命令execv(),如下所示:

char *const ptr={"/bin/sh","-c","ls","-a" ,NULL};
execv("/bin/sh",ptr);

但是,此命令不会列出隐藏文件。我做错了什么?

2 个答案:

答案 0 :(得分:9)

我不确定你为什么通过/bin/sh传递这个...但是因为你是,你需要将-c之后的所有参数作为单个值传递,因为这些现在是由/bin/sh解释。

示例是比较

的shell语法
/bin/sh -c ls -a

/bin/sh -c 'ls -a'

第二个有效,但第一个没有。

因此,您的ptr应定义为

char * const ptr[]={"/bin/sh","-c","ls -a" ,NULL}; 

答案 1 :(得分:5)

如果你需要从程序获取目录的内容,那么这不是最好的方法 - 你将有效地解析ls的输出,{{3 }}

相反,您可以使用libc函数generally considered a bad ideaopendir()来实现此目标。

这是一个小例子程序,它将迭代(并列出)当前目录中的所有文件:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>

int main (int argc, char **argv) {
    DIR *dirp;
    struct dirent *dp;

    dirp = opendir(".");
    if (!dirp) {
        perror("opendir()");
        exit(1);
    }

    while ((dp = readdir(dirp))) {
        puts(dp->d_name);
    }

    if (errno) {
        perror("readdir()");
        exit(1);
    }

    return 0;
}

请注意,与默认的ls -a输出不同,列表不会被排序。