Я пытаюсь запустить команду 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;
}
Подстановочные знаки, подобные *, оцениваются оболочкой, поэтому вам придется вызывать оболочку напрямую, если вы хотите, чтобы она что-то для вас обрабатывала.
Например, позвонив /bin/sh -c "ls /home/aidan/Pictures/Wallpapers/*/*.{jpg,JPG,png,PNG}"
вместо ls /home/aidan/Pictures/Wallpapers/*/*.{jpg,JPG,png,PNG}
буду работать. Существует также системный вызов system()
это вызывает данную команду в оболочке по умолчанию для вас.
Тем не менее, использование оболочки для выполнения очень опасно если вы передадите ненадежный пользовательский ввод в оболочку. Поэтому попробуйте перечислить все файлы и затем использовать собственное глобальное решение для фильтрации их вместо расширений оболочки.
Подстановочные знаки типа «*» или «{x, y, z}» оцениваются оболочкой. Если вы запускаете программу без промежуточной оболочки, они не оцениваются, а передаются в программу дословно, что должно объяснить сообщение об ошибке.