Как я могу реализовать команду "найти", используя exec-family? - PullRequest
1 голос
/ 11 октября 2019

Я пытаюсь реализовать "" поиск. -type f -exec file {} \; "эта команда с помощью функции execvp. Если я запускаю ее в оболочке, она работает хорошо. Однако, когда я запускаю ее с помощью execvp, она продолжает: >> find: отсутствует аргумент` -exec '.

Вот мой код

#include "stdio.h"
#include "unistd.h"
#include "stdlib.h"

int main()
{
    char *argv[]={"find", ".", "-type","f","-exec", "file", "{}", "\\;",NULL};
    execvp(argv[0],argv);
}

1 Ответ

1 голос
/ 11 октября 2019

Правила выхода могут быть хитрыми, особенно если задействованы несколько уровней или разные контексты:)

"\\;" выходит из "\;". find ожидает, что его -exec args будет завершено ;, поэтому вам нужно передать ";" напрямую.

Почему бы не "\\;", спросите вы? Потому что ; имеет особое значение в оболочках. Вы должны избегать его в оболочке, потому что его особое значение нужно игнорировать и чтобы оболочка вызывала команду с литералом ;. При использовании execvp оболочка не задействуется, поэтому вам не нужно экранировать символ и передавать его дословно.

#include "stdio.h"
#include "unistd.h"
#include "stdlib.h"

int main()
{
    char *argv[]={"find", ".", "-type","f","-exec", "file", "{}", ";",NULL};
    execvp(argv[0],argv);
}

Если вы хотели такое же (ошибочное) поведение и это сообщение об ошибке вОболочка, вам нужно будет дважды экранировать свой exec терминатор:

find . -type f -exec file {} \\\;

или

find . -type f -exec file {} '\;'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...