Правила выхода могут быть хитрыми, особенно если задействованы несколько уровней или разные контексты:)
"\\;"
выходит из "\;"
. 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 {} '\;'