Почему 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. 
  • Как положить $ @ в кавычки?
  • При запуске сценария оболочки можно передавать конкретные позиционные параметры без необходимости вводить их в порядок?
  • Что такое отображение эха $ -1?
  • Передача аргументов командной строки java из сценария JPackage
  • Как мне сохранить параметры команды от нарушения других сценариев, выполняемых в моей команде?
  • Индексирование и изменение массива параметров Bash $ @
  • Как назначить значение входной переменной в оболочке
  • Синтаксический вопрос Shell с сложным расширением параметра
  • как заставить getopts просто прочитать первое сообщение персонажа `-`
  • печатать пустую строку в sed output при передаче нескольких имен файлов
  • Как безопасно передавать переменные в сценарии с поддержкой root?
  • Должны ли отбрасываться stdin или имена файлов, если оба предоставлены?
  • Interesting Posts

    Почему мне нужно дважды вводить exit в моем терминале?

    Разработка сценария bash с использованием переменных

    Способы предоставить приоритет сети «бездействующий»

    Как войти в систему как root из Bash и делать что-то

    путь bind к 'named.pid' выглядит немного странно после установки не столь гладкой упаковки

    Упаковка только определенного подмножества встроенных файлов

    dnsmasq недоступен из сетевого пространства имен сначала

    Эффективно работает makepkg ar на git master (частые, но «маленькие» изменения)

    Поиск строки и печать первого столбца первой строки с помощью awk

    Linux mint 15, synaptic не может загружать все индексы репозитория

    Лучше ли загружать Firefox с веб-сайта или использовать диспетчер пакетов?

    Когда именно tmpwatch очищает файлы, я помещаю их в / tmp?

    Неизвестный мост восстанавливается после перезагрузки Ubuntu 15.04@VMWare

    не удалось запустить nginx на centos 7

    настроить беспроводной маршрутизатор с помощью файлов systemd-networkd * .net

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