пути должны предшествовать выражению: `>' в поиске кода execvp c

avatar
user3659529
28 февраля 2022 в 10:23
459
1
0
#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.

Источник
tripleee
28 февраля 2022 в 10:28
6

Перенаправление, которое вы пытаетесь использовать, является функцией оболочки, но здесь оболочки нет. Просто сначала откройте дескриптор файла и соедините стандартный вывод find с этим дескриптором файла. Я ожидаю, что это общий FAQ.

tripleee
28 февраля 2022 в 10:30
0

Возможный дубликат coderhelper.com/questions/46648120/…

user1934428
28 февраля 2022 в 12:07
0

Также обратите внимание, что в вашем коде C, даже если вы не получите эту ошибку, find будет искать файлы, имя которых начинается с апострофа. Причина та же, что указана tripee: не используется bash, который удалил бы кавычки вокруг *.txt.

user3659529
28 февраля 2022 в 12:16
0

@ user1934428 неважно, я все равно не понял, что он сказал. Странно, что find отлично работает без знака >, если нужно вывести только имена файлов на экран.

user1934428
28 февраля 2022 в 12:19
0

> указывает оболочке перенаправить стандартный вывод процесса в файл. Первоначально (то есть, когда вы запускаете программу изнутри своего терминала и находитесь в интерактивной оболочке), стандартный вывод собирается из вашей программы терминала и отображается на экране, чтобы вы могли видеть, что происходит.

user1934428
28 февраля 2022 в 12:20
0

Могу я также предложить удалить тег bash? В вашем вопросе нет bash.

aschepler
28 февраля 2022 в 12:53
0

Хотя это несколько менее эффективно, чем самостоятельное перенаправление вывода, вы также можете подключить оболочку, используя system("find ... > all_text_files.txt"); или const char *argv[] = {"-c", "find ... > all_text_files.txt", NULL}; execv("/bin/sh", argv);.

Ответы (1)

avatar
user1934428
28 февраля 2022 в 12:13
1

Подумайте о своем примере с точки зрения программы find. Когда find запускается с использованием вашего execvp, он получает в своем векторе argv следующие параметры:

  1. /home
  2. -имя
  3. '*.txt'
  4. '>'
  5. all_txt_files.txt
  6. НОЛЬ

Когда вы вызываете find из командной строки, оболочка настраивает перенаправление и find видит следующие параметры:

  1. /дом
  2. -имя
  3. *.txt
  4. НОЛЬ

Как видите, параметры различаются по количеству и содержанию. Неудивительно, что вы получите другой результат.

Проделайте то же самое в своей программе-оболочке, вам придется имитировать то, что делает оболочка.

tripleee
3 марта 2022 в 08:29
0

Считаете ли вы, что это все еще необходимо объяснить проблему более подробно? Если это так, пожалуйста, оставьте комментарий, чтобы помочь улучшить ответ. С другой стороны, если это решило вашу проблему, рассмотрите возможность его принятия. Кроме того, вы можете опубликовать свой собственный ответ и принять его. Принятие ответа поможет будущим посетителям отметить вопрос как решенный. См. также помощь.