#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void){
char *argv[6] = {"/home", "-name", "'*.txt'", ">", "all_txt_files.txt", NULL};
printf("%s\n", argv[2]);
execvp("find", argv);
return 0;
}
Если я запускаю в bash find /home -name '*.txt' > Jerry.txt
, все работает нормально. Но когда я запускаю приведенный выше код c, он всегда выдает ошибку /home: paths must precede expression: `>'
.
Похоже на бред, может кто поможет?
Использование WSL 1 в Windows 10.
Перенаправление, которое вы пытаетесь использовать, является функцией оболочки, но здесь оболочки нет. Просто сначала откройте дескриптор файла и соедините стандартный вывод
find
с этим дескриптором файла. Я ожидаю, что это общий FAQ.Возможный дубликат coderhelper.com/questions/46648120/…
Также обратите внимание, что в вашем коде C, даже если вы не получите эту ошибку,
find
будет искать файлы, имя которых начинается с апострофа. Причина та же, что указана tripee: не используется bash, который удалил бы кавычки вокруг *.txt.@ user1934428 неважно, я все равно не понял, что он сказал. Странно, что find отлично работает без знака >, если нужно вывести только имена файлов на экран.
>
указывает оболочке перенаправить стандартный вывод процесса в файл. Первоначально (то есть, когда вы запускаете программу изнутри своего терминала и находитесь в интерактивной оболочке), стандартный вывод собирается из вашей программы терминала и отображается на экране, чтобы вы могли видеть, что происходит.Могу я также предложить удалить тег bash? В вашем вопросе нет bash.
Хотя это несколько менее эффективно, чем самостоятельное перенаправление вывода, вы также можете подключить оболочку, используя
system("find ... > all_text_files.txt");
илиconst char *argv[] = {"-c", "find ... > all_text_files.txt", NULL}; execv("/bin/sh", argv);
.