7

Некоторые программы будут использовать такие параметры:

$ someprogram -orange apple

И другие программы будут использовать что-то вроде этого:

$ otherprogram --orange apple

Есть ли "правило" или соглашение для этого в Linux/Unix/OSX?

2 ответа2

22

Наиболее распространенным является стиль 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 .
5

Обычно первая встречается в старых программах, которые слишком хорошо укоренились для изменения. Такие длинные параметры несовместимы со стандартной функцией getopt() .

Второй стиль был введен GNU getopt_long() и соответствует существующим стандартам, которые предполагают, что первый стиль будет связан с короткими опциями (то есть ожидается, что -orange означает -o -r -a -n -g -e), Этот стиль длинного варианта настоятельно рекомендуется.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .