ls命令在终端中运行不能在C ++中运行

时间:2015-07-09 16:35:31

标签: c++ linux ls

我正在尝试运行命令ls /home/aidan/Pictures/Wallpapers/*/*.{jpg,JPG,png,PNG}来获取壁纸列表,它在终端中运行良好,但是当我从C ++运行时,它告诉我ls: cannot access /home/aidan/Pictures/Wallpapers/*/*.{jpg,JPG,png,PNG}: No such file or directory。有谁知道帽子了?

我用来运行它的命令:

std::string exec(std::string command) {
    const char *cmd = command.c_str();
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[128];
    std::string result = "";
    while(!feof(pipe)) {
        if(fgets(buffer, 128, pipe) != NULL)
            result += buffer;
    }
    pclose(pipe);
    return result;
}

2 个答案:

答案 0 :(得分:2)

shell评估类似“*”或“{x,y,z}”的通配符。如果您运行没有中间shell的程序,那么这些程序不会被评估,而是逐字传递给程序,这应该解释错误消息。

答案 1 :(得分:1)

像*这样的通配符由shell评估,因此如果你想让它为你处理一些东西,你必须直接调用它。

例如,调用/bin/sh -c "ls /home/aidan/Pictures/Wallpapers/*/*.{jpg,JPG,png,PNG}"代替ls /home/aidan/Pictures/Wallpapers/*/*.{jpg,JPG,png,PNG}即可。还有一个名为system()的系统调用,它会为您调用默认shell中的给定命令。

但是,如果将不受信任的用户输入传递给shell,则使用shell进行通配是very dangerous。因此,尝试列出所有文件,然后使用本机通配解决方案来过滤它们而不是shell扩展。