Каков общий синтаксис команды оболочки Unix? - PullRequest
10 голосов
/ 29 января 2010

В частности, почему иногда параметрам некоторых команд предшествует знак +, а иногда знак -?

например:

sort -f
sort -nr
sort +4n
sort +3nr

Ответы [ 4 ]

21 голосов
/ 29 января 2010

В наши дни стандарт POSIX, использующий getopt() (он же getopt(3)), широко используется в качестве стандартного обозначения, но в первые дни люди экспериментировали. На некоторых машинах команда sort больше не поддерживает нотацию +. Тем не менее, различные команды (особенно ar и tar) принимают элементы управления без префиксного символа - и dd (на что ссылается Алок в комментарии) вообще использует другое соглашение.

Соглашение GNU об использовании '--' для длинных опций (поддерживается getopt_long(3)) было изменено с использования '+'. Конечно, программное обеспечение X11 использует одну черту перед многосимвольными параметрами. Итак, все это коллекция исторических реликвий, когда люди экспериментировали с тем, как лучше всего с этим справиться.

POSIX документирует Соглашения о коммунальных услугах , с которыми он работает, за исключением случаев, когда исторический прецедент сильнее.


Какие существуют стили обработки опций?

[В свое время SO 367309 содержал следующий материал в качестве моего ответа. Первоначально его спросили * * * * * * * * * * * * FerranB , но впоследствии он был закрыт и удален.]

Сколько разных типов опций вы узнаете? Я могу думать о многие, в том числе:

  • Однобуквенные опции, начинающиеся с одной черты, сгруппированные при наличии без аргумента, аргумент может быть прикреплен к варианту письма или в следующем аргумент (много, много команд Unix; большинство команд POSIX).
  • Однобуквенные опции, начинающиеся с одной черты, группировка запрещена, аргументы должны быть приложены (RCS).
  • Однобуквенные опции, начинающиеся с одной черты, группировка запрещена, аргументы должны быть отдельными (pre-POSIX SCCS, IIRC).
  • Многобуквенные опции, начинающиеся с одной черты, аргументы могут быть присоединен или в следующем аргументе (программы X11; также Java и многие программы в Mac OS X с наследием NeXTSTEP).
  • Многобуквенные опции, начинающиеся с одной черты, могут быть сокращены (Ясный футляр Atria).
  • Варианты с несколькими буквами, перед которыми стоит один плюс (устарел).
  • Варианты с несколькими буквами, перед которыми стоит двойная черта; аргументы могут следовать за '=' или быть отдельным (утилиты GNU).
  • Опции без префикса / суффикса, некоторые имена имеют сокращения или являются подразумевается, аргументы должны быть отдельными. ( AmigaOS Shell )

Для опций, принимающих необязательный аргумент, иногда необходимо добавить аргумент (co -p1.3 rcsfile.c), иногда он должен следовать за знаком «=». POSIX не поддерживает опционально аргументы осмысленно (POSIX getopt () разрешает их только для последнего опция в командной строке).

Все разумные системы опций используют опцию, состоящую из двойной черты ('--') один означает "конец опций" - следующие аргументы «неопционные аргументы» (обычно имена файлов; POSIX называет их «операндами») даже если они начинаются с тире. (Я считаю поддержку этой записи обязательной. Имейте в виду, что если перед -- стоит опция, требующая аргумента, -- будет рассматриваться как аргумент опции, а не как маркер «конца опций» .)

Многие, но не все программы принимают одинарную черту в качестве имени файла стандартный ввод (обычно) или стандартный вывод (иногда). Иногда, как и в GNU 'tar', оба могут использоваться в одной командной строке:

... | tar -cf - -F - | ...

Первый сольный тире означает «запись в стандартный вывод»; второе означает «прочитать файл» имена из stdin '.

Некоторые программы используют другие соглашения, то есть параметры, которым не предшествует тире. Многие из них относятся к древнейшим временам Unix. Например, 'tar' и 'ar' оба принимают опции без тире, поэтому:

tar cvzf /tmp/somefile.tgz some/directory

Команда dd использует opt=value исключительно:

dd if=/some/file of=/another/file bs=16k count=200

Некоторые программы позволяют чередовать параметры и другие аргументы полностью; компилятор C, make и утилиты GNU работают без POSIXLY_CORRECT в среде являются примерами. Многие программы ожидают варианты, предшествующие другим аргументам.

Обратите внимание, что git и другие команды VCS часто используют гибридную систему:

git commit -m 'This is why it was committed'

В качестве одного из аргументов указывается подкоманда. Часто между командой и подкомандой могут указываться необязательные «глобальные» параметры. Есть примеры этого в POSIX; команда sccs относится к этой категории; Вы можете утверждать, что некоторые из других команд, которые запускают другие команды, также находятся в этой категории: nice и xargs возникают из POSIX; sudo - это не POSIX пример, как и svn и cvs.


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

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

Еще одним нежелательным поведением является несогласованность в стиле обработки аргументы (особенно для одной программы, но также в пределах набора программы). Либо требовать вложенных аргументов, либо требовать отдельного аргументы (или разрешить либо), но не имеют некоторые параметры, требующие приложенный аргумент и другие, требующие отдельного аргумента. И быть согласен с тем, можно ли использовать «=» для разделения опции и аргумент.

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


Что бы вы ни делали, пожалуйста, прочитайте Параметры командной строки TAOUP и рассмотрим Стандарты для интерфейсов командной строки . ( Добавлено J F Себастьян - спасибо; Я согласен. )

5 голосов
/ 29 января 2010

Это совершенно произвольно; команда может реализовывать всю обработку опций по-своему, или она может вызывать некоторые другие вспомогательные функции. Семейство функций getopt() довольно популярно, поэтому большая часть программного обеспечения, написанного даже недавно, следует соглашениям, установленным этими процедурами. Конечно, всегда есть исключения!

1 голос
/ 30 января 2010

Команда оболочки - это просто программа, и она может интерпретировать свою командную строку так, как ей нравится. У Unix никогда не было ничего похожего на интерфейсную полицию Apple, которая бы обеспечивала согласованность интерфейса командной строки для всех приложений. В результате возникает несоответствие, особенно в старых командах.

Вглядываясь в свой хрустальный шар, я думаю, что инструменты командной строки будут медленно переходить к стандартам GNU, двойным тире и прочему. (Я вырос с одиночными чертами и все еще нахожу двойную черту очень неловкой, но она соответствует .)

1 голос
/ 29 января 2010

Это оставлено для приложений, чтобы проанализировать параметры, следовательно, несоответствие. Развертывание на вашем примере сортировки эквивалентно для coreutils:

sort -k3
sort --k 3
sort --key 3
sort --key=3
_POSIX2_VERSION=199209 sort +2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...