我正在尝试运行命令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;
}
答案 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扩展。