Существуют ли стандарты для ключей и аргументов командной строки Linux? - PullRequest
46 голосов
/ 22 января 2012

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

Однако в некоторых случаях заглавные буквы используются для инвертирования опции. Таким образом, «-d» может означать запуск в качестве демона, но «-D» будет означать , а не запуск в качестве демона. (Почему бы просто не опустить опцию, если она вам не нужна? Это никогда не было ясно, но на самом деле она довольно распространена, поэтому я полагаю, что должна быть какая-то причина.) Но в некоторых программах заглавная буква - это совершенно не связанный вариант; если -d запускается как демон, то -D может включать режим отладки. Есть ли какой-то всеобъемлющий принцип за этим, и какой лучше выбрать? Или мы просто имеем дело с "что бы ни работало"?

Существуют также некоторые команды, которые в дополнение к (или вместо) опциям с аргументами просто принимают одиночные аргументы. cp - хороший пример этого; кроме пары редко используемых переключателей предполагается, что последним полученным аргументом является пункт назначения, а любые аргументы между списком опций и пунктом назначения - источником. Есть ли эмпирическое правило, когда «нормально» полагаться на такой порядок, вместо использования явных флагов опций с аргументами?

Ответы [ 4 ]

33 голосов
/ 22 января 2012

Обычно да.

19 голосов
/ 22 января 2012

ESR собрал много информации об этом в своей книге "Искусство программирования в UNIX".Вот фрагмент кода.

-a
Все (без аргументов).Если есть опция --all в стиле GNU, для -a быть чем-то иным, кроме его синонима, было бы довольно удивительно.Примеры: fuser (1), fetchmail (1).

Append, как в tar (1).Это часто сочетается с -d для удаления.

-b
Размер буфера или блока (с аргументом).Установите критический размер буфера или (в программе, связанной с архивированием или управлением носителями), установите размер блока.Примеры: du (1), df (1), tar (1).

Пакет.Если программа является естественно интерактивной, -b может использоваться для подавления подсказок или установки других параметров, подходящих для приема ввода из файла, а не оператора-человека.Пример: flex (1).

-c
Команда (с аргументом).Если программа является интерпретатором, который обычно принимает команды от стандартного ввода, ожидается, что параметр аргумента -c будет передан ей в виде одной строки ввода.Это соглашение особенно важно для оболочек и интерпретаторов, подобных оболочке.Примеры: sh (1), ash (1), bsh (1), ksh (1), python (1).Сравните -e ниже.

Проверка (без аргументов).Проверьте правильность аргумента (ов) файла для команды, но на самом деле не выполняйте обычную обработку.Часто используется в качестве опции проверки синтаксиса программами, выполняющими интерпретацию командных файлов.Примеры: getty (1), perl (1).

См. Полный список на http://catb.org/~esr/writings/taoup/html/ch10s05.html

10 голосов
/ 17 января 2013

Интерфейс командной строки Linux / GNU соответствует стандарту POSIX.Это отмечено GNU в их стандартах: http://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html.

Синтаксис командной строки также является частью спецификации Single Unix, хотя --long-options - это инновация GNU IIRC.

Смотрите здесь: http://pubs.opengroup.org/onlinepubs/7908799/xbd/utilconv.html

Но да, этот стандарт реализован как getopt.

1 голос
/ 04 января 2019

Краткий обзор потока:

  • Ваш CLI должен отображать справку при отсутствии или неправильных параметрах в дополнение к сообщению об ошибке, если таковые имеются.

  • Вы должны использовать - для однобуквенного флага или опции и -- для длинной опции, например -a и --all

  • Все программы должны поддерживатьдва стандартных варианта: -v --version и -h --help.

    • -h и --help => Дать сообщение об использовании и выйти
    • -v и --version => Показать версию программы и выйти

См. Ссылки (IEEE и GNU getopt), приведенные в этом ответе https://stackoverflow.com/a/8957246

...