Программы
Это вам не это! Как утилита find работает с exec

Это вам не это! Как утилита find работает с exec

find, как и многие утилиты Unix, имеет довольно много интересных ключей, которые стоит знать. Но порой это уже на грани "обязан знать"

Часто бывает, что проблему решает один ключ. Один ключ какой-то утилиты, который ищешь пару дней. Он делает "хорошо" в каком-то конкретном редком случае, и ты не ругаешься на него, ведь это реально редкий случай.

Но бывают и иные варианты...

$ find /etc/passwd -exec false \;
$ echo $?
0

Мы ищем файл /etc/passwd, который есть в каждом unix - можете проверить. И при нахождении его исполняем false - сделать неправду / сделать ошибку - в зависимости от контекста.

И, что бы вы думали... Всё нормально! Ошибки нет, переменная кода возврата говорит, что всё ок...

$ find /etc/passwd -exec false '{}' '+'
$ echo $?
1

А при таком синтаксисе уже таки находятся ошибки...

Идём в man и видим:

-exec utility [argument ...] ;
             True if the program named utility returns a zero value as its exit status.  Optional arguments may be passed to the utility.  The expression must be terminated by a semicolon (``;'').  If you invoke find from a shell you may need to quote the semicolon if the shell would otherwise treat it as a control operator.  If the string ``{}'' appears anywhere in the utility name or the arguments it is replaced by the pathname of the current file.  Utility will be executed from the directory from which find was executed. Utility and arguments are not subject to the further expansion of shell patterns and constructs.


-exec utility [argument ...] {} +
             Same as -exec, except that ``{}'' is replaced with as many pathnames as possible for each invocation of utility.  This behaviour is similar to that of xargs(1).

Формулировки прекрасны, никто явно не говорит о красивом профукивании в одном случае $? и его присутствии в другом... Лишь маленькая приписка о похожести на xargs нам может намекнуть.

В данном случае я зол на утилиту. И на документацию. Странно видеть такое в Unix. Ну и отпало желание в будущем использовать exec - в ряде случаев понятнее будет сразу xargs юзать.

Изображение Шпаргалка по командам Linux, FreeBSD и MacOS