Почему обратная косая черта и точка с запятой требуется с помощью команды find -exec?

Я начал комбинировать разные команды в терминале linux. Мне интересно, почему обратная косая черта и точка с запятой необходимы для команды, например:

find ./ -name 'blabla' -exec cp {} ./test \;

когда простая команда cp просто:

cp randomfile ./test

без \;

Должны ли они четко указывать конец команды или это просто требуется в документации? Каков основной принцип?

Спасибо!

Ответ 1

из "man find":

Все следующее           аргументы для поиска считаются аргументами команды до тех пор, пока           аргумент, состоящий из ';' встречается.

find нужно знать, когда аргументы exec прекращаются. Естественно прекратить команду оболочки с; потому что и оболочка использует этот символ. По той же причине такой символ должен быть экранирован при вставке через оболочку.

Ответ 2

Используется обратная косая черта перед точкой с запятой, поскольку ; является одним из операторов списка (или &&, ||) для разделения команд оболочки. В примере:

command1; command2

Утилита find использует ; или + для завершения команд оболочки, вызванных -exec.

Таким образом, чтобы избежать специальных интерпретаций оболочки из интерпретатора, они должны быть экранированы с обратной косой чертой, чтобы удалить какой-либо особый смысл для следующего чтения символа и продолжения строки.

Поэтому для команды find разрешен следующий пример синтаксиса:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

См. также: