Существуют ли стандарты для параметров и аргументов командной строки Linux?

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

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

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

5 ответов

Решение

Вообще-то да.

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

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

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

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

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


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

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

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

Интерфейс командной строки 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.

Краткое резюме темы:

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

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

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

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

См. Ссылки (IEEE и GNU getopt), приведенные в этом ответе /questions/21327605/suschestvuyut-li-standartyi-dlya-parametrov-i-argumentov-komandnoj-stroki-linux/21327621#21327621

Unix: одинарное тире -

BSD: без тире

GNU: двойное тире -

Другие вопросы по тегам