Передающие опции к программе: какова конвенция для одного тире по сравнению с два?

Некоторые программы выберут варианты как это:

$ someprogram -orange apple

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

$ otherprogram --orange apple

Существует ли "правило" или конвенция для этого в Linux/Unix/OSX?

7
задан 20.03.2011, 22:59

2 ответа

Наиболее распространенным является 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 эквивалентны. (Но не всегда – например, завихрение не принимает первого, только последний.)

    (Если я вспоминаю правильно, долгие используемые опции + как префикс, прежде чем это было изменено на --.)

  • Спецификация POSIX имеет раздел Utility Argument Syntax, который описывает один параметр символа.


Большинство Windows-программ использует свои собственные синтаксические анализаторы, сводя пользователей с ума.

  • Некоторые требуют /a /b /c, другие позволяют VMS-стиль /a/b/c, все же другие предпочитают стиль Unix /abc.
  • Большая часть использования / как префикс, некоторые также принимают -, другие принимают только -.
  • Значения могут быть даны как /foo bar, /foo=bar, /foo:bar.
  • Обычно пробелы могут быть /quoted "like this", но некоторые программы берут " как буквенный символ. (Это - оборотная сторона разрешения программе сделать ее собственное разделение слова; в Unix это обрабатывается оболочкой.)
  • Межплатформенные программы могут использовать реализацию getopt.
22
ответ дан 07.12.2019, 14:27

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

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

5
ответ дан 07.12.2019, 14:27

Теги

Похожие вопросы