Почему POSIX Find Parameters отличается от других стилей программы?

Почему параметр в команде find POSIX добавлен с одним дефис для многосимвольных имен параметров, в то время как в большинстве других программ используется один дефис для обозначения нескольких односимвольных флагов и двойных дефис для обозначения одиночных имен параметров с несколькими символами?

Это кажется непоследовательным, и мне любопытно, как

A. Почему это действительно не противоречит, или
B. История этого решения.

3 Solutions collect form web for “Почему POSIX Find Parameters отличается от других стилей программы?”

Обратите внимание, что поиск POSIX поддерживает такие параметры, как другие команды, и -- помечает их конец, как и другие команды. Это -H и -L .

Параметры -print , -type … не являются параметрами, их иногда называют предикатами . Они являются аргументами, порядок которых имеет значение, которые появляются после путей к файлам, которые сами появляются после опций. У вас также есть ( и ! . Вместе они создают выражение , которое используется для определения того, какие файлы нужно найти.

find не единственный. [ (aka test ) и expr – это другие команды, аргументы которых используются для построения выражения .

Как и find , у [ есть операторы, которые начинаются с - и больше чем одна буква ( -gt , -gt …).

Как и find , у test есть проблемы, когда эти операторы могут быть путаны с операндами .

 find -- "$file1" "$file2" -type f [ -f "$file1" -a -f "$file2" ] 

Если $file2 есть ! , это проблема с find . Если это = , это проблема с (некоторыми) [ .

Для всех find , test и expr , использование вариантов для создания выражения на самом деле не сработало. Другим вариантом могло быть то, что одна строка была оценена как выражение типа awk или sed . как для

 find f1 f2 \( -type f -mtime -1 -o ! -type f -newer x \) -exec ls -ld {} + 

Делать:

 find 'found = 0 if (typeof($f) == "f") { if (age($f) > 1) found=1 } else if (age($f) < age("x")) found = 1 if ($found) exec_multi("ls -ld {}")' f1 f2 

Но это означает реализацию грамматического анализатора в find . Это также означает потенциальный котировки кошмара для "x" и командной строки выше.

Фактически AT & T Research действительно придумал такую ​​команду: tw (tree walker), но, хотя теперь это открытый исходный код, я не знаю, что он действительно используется из AT & T.

find старше, чем соглашение GNU об использовании -- для многобуквенных опций. GNU представила это соглашение, чтобы нарушить существующую несогласованность между программами с однобуквенными опциями, для которых -bar означал три варианта -b -a -r и программы с многобуквенными опциями, для которых -bar означал одну опцию тем, что имя. К моменту появления GNU это могло повлиять на будущие программы, но не изменять существующие программы, такие как find или другие, такие как утилиты X11.

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

Я думаю, что не было сознательного решения, чтобы найти другую. У меня нет ссылок, кроме этого обмена по электронной почте, но из того, что я помню (воспользовавшись поиском с середины восьмидесятых):

Что вы должны понять, так это то, что для указания опций и аргументов (в качестве аргументов командной строки для программ) не было никаких стандартов. В разных программах реализованы разные способы ведения дел. В какой-то момент одна тире для опций и не-тире для аргументов была повторно использована / скопирована из часто используемых команд, а версия getopt стала доступной как для оболочек, так и для версий на C. (помню, мне пришлось скомпилировать мои собственные потому что * nix, над которым я работал, не имел его в библиотеке).

Конечно, однотипные опции с одним символом устанавливали ограничения на tty (то же самое, что приводит к сокращенным командам ( cp vs. copy ), но там, где не объяснимо. Разработчики find, вероятно, предпочли удлинить опцию одного символа для большей ясности, поскольку а также более 26 вариантов символов в нижнем регистре. Они делали это до двойного тире -- для длинных вариантов стали популярными (середина девятнадцати лет IIRC).

На исходной странице руководства внизу:

 BUGS The syntax is painful. 
  • Как передать параметры псевдониму?
  • Linux: Как обновить ssh-keygen?
  • Можно ли проверить использование хэша файла вместо всего файла, используя OpenSSL dgst?
  • Как заменить аргумент awk?
  • Индексирование и изменение массива параметров Bash $ @
  • Количество элементов в массиве bash, где имя массива является динамическим (т.е. хранится в переменной)
  • Как запустить pure-ftpd с портом в качестве службы
  • Как передать строковый параметр в функции bash?
  • Как отключить позиционные параметры?
  • Как управлять всеми параметрами сценария оболочки сразу?
  • Можно ли использовать переменные параметров оболочки ($ 1, ..., $ @) непосредственно в CLI?
  • Interesting Posts

    dash reports «Синтаксическая ошибка:» («неожиданно» при использовании замещения процесса

    Для набора номеров строк … Извлеките контент между первым и последним появлением разных шаблонов

    Перезаписанное восстановление файлов суперблока и dd

    Для перенаправления ввода существуют функциональные различия между bash / zsh <<< «$ (<файл)» и традиционным <file?

    bash: test, если $ WORD находится в наборе

    Как ограничить пространство для хранения для пользователя?

    ограничение скорости загрузки на основе использования сети

    Использование столбца nos в качестве значения переменной

    не удалось открыть X-сервер

    Печать коротких латексных фрагментов

    Усеченный результат, возвращаемый JOIN

    Совокупный код состояния из суб-скриптов в скрипте

    Использование SUDO для выполнения общей команды внутри не доступного каталога

    Доступ к X-окну и звуку на ноутбуке на другом Unix

    Печать строк журнала, исключая ранее повторяющиеся строки?

    Linux и Unix - лучшая ОС в мире.