Есть ли какая-либо причина указывать местозаполнитель в находке ... -exec command_to_run {} \;заявление? - PullRequest
0 голосов
/ 11 сентября 2018

Иногда я вижу, как люди помещают заполнитель ({}) в одинарные кавычки. Вероятно, это связано с тем, что он используется в качестве примера в руководстве по GNU find.

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

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

Имена файлов, содержащие <space>, <newline>, <tab>, |, &, ;, <, >, (, ), $, `, \, ", ', *, ?, [, #, ~, =, %, { и } все правильно обрабатываются в GNU и FreeBSD find, независимо от того, заключен ли заполнитель в одинарные кавычки.

Является ли пример, показанный в руководстве GNU find, примером программирования культа груза ? Одиночные кавычки заполнитель покрывает какой-то крайний случай, о котором я не знаю, или это пустая кавычка?

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Пока вы используете POSIX-совместимую оболочку, нет оснований заключать в кавычки заполнитель ({}).Если вы используете fish или rc shell, вам нужно указать заполнитель для предотвращения расширения.Предположительно, могут быть некоторые не современные варианты csh, которые требуют, чтобы заполнитель был заключен в кавычки.Посмотрите на удивительные ответы на этот вопрос о Unix и Linux, которые делают больше справедливости, чем я когда-либо мог.

0 голосов
/ 11 сентября 2018

В разделе EXAMPLES справочных страниц GNU find можно найти следующее предложение:

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

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

Я не смог придумать пример, где {} без кавычек ломает команду -exec, даже с пробелами или управляющим символом в имени файла.

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

Например, добавив $ передимя файла будет ломаться в следующем случае:

find . -type f -exec echo ${} \;

, тогда как оно не будет ломаться, если выражение будет заключено в кавычки ":

find . -type f -exec echo '${}' \;
...