Некоторые программы будут использовать такие параметры:
$ someprogram -orange apple
И другие программы будут использовать что-то вроде этого:
$ otherprogram --orange apple
Есть ли "правило" или соглашение для этого в Linux/Unix/OSX?
Наиболее распространенным является стиль GNU getopt
, с одной чертой для коротких опций и двумя чертами для длинных.
Первоначально Unix-программы использовали однобуквенные опции, начинающиеся с одной черты и опционально связанные:
ls -laF
ls -l -a -F
Две команды выше равны.
Когда параметр принимает значение, он переопределяет пакетирование: в gpg -aofoo.gpg
, -a
и -o
- параметры, а foo.gpg
- значение, присвоенное -o
.
Во всяком случае, большинство из них.
tar cvzf
- это обычное явление. Текущие версии также принимают tar -cvzf
, и в зависимости от того, добавляете ли вы тире, аргументы будут интерпретироваться по-разному. Например, эти два значения означают одно и то же (обратите внимание, что параметры без черточки находятся не сразу перед их значением):
tar -xf file.tgz -vzO /etc/passwd /var/backups
tar xfvzO file.tgz /etc/passwd /var/backups
BSD ps
всегда использует -
; SysV ps
никогда не делает. Версия Linux принимает обе версии и меняет свое поведение в зависимости от того, был ли перед параметром префикс с тире. (В отличие от приведенного выше примера tar, ps также изменяет значения параметров.)
Программы X11 использовали длинные опции, перед которыми ставится одиночная черта или иногда знак плюс:
xterm -class FooTerm +vb -u8
Это устанавливает параметры class
и u8
и отменяет параметр vb
.
Стиль X11 несовместим с комплектацией опций.
Позже в GNU getopt()
были добавлены длинные опции, совместимые с однобуквенными.
gpg -se --no-armor --output=signed.gpg
Это устанавливает -s
, -e
и --no-armor
(что противоположно --armor
).
Обычно, --output=signed.gpg
и --output signed.gpg
эквивалентны. (Но не всегда - например, curl не принимает первое, только второе.)
(Если я правильно помню, длинные опции использовали префикс +
до того, как он был изменен на --
.)
В спецификации POSIX есть раздел Синтаксис аргумента служебной программы , в котором описываются односимвольные параметры.
Большинство программ Windows используют свои собственные парсеры, сводя пользователей с ума.
/a /b /c
, другие допускают VMS-стиль /a/b/c
, а другие предпочитают Unix-стиль /abc
./
качестве префикса, некоторые также принимают -
, другие принимают только -
./foo bar
, /foo=bar
, /foo:bar
./quoted "like this"
, но некоторые программы воспринимают "
как буквальный символ». (Это недостаток, позволяющий программе самостоятельно разбивать слова; в Unix это обрабатывается оболочкой.)getopt
.Обычно первая встречается в старых программах, которые слишком хорошо укоренились для изменения. Такие длинные параметры несовместимы со стандартной функцией getopt()
.
Второй стиль был введен GNU getopt_long()
и соответствует существующим стандартам, которые предполагают, что первый стиль будет связан с короткими опциями (то есть ожидается, что -orange
означает -o -r -a -n -g -e
), Этот стиль длинного варианта настоятельно рекомендуется.