Чи існує "стандартний" формат для довідкового тексту командного рядка / оболонки?


239

Якщо ні, чи існує фактичний стандарт? В основному я пишу довідковий текст командного рядка так:

usage: app_name [options] required_input required_input2
  options:
    -a, --argument     Does something
    -b required     Does something with "required"
    -c, --command required     Something else
    -d [optlistitem1 optlistitem 2 ... ]     Something with list

Я зробив це, по суті, просто прочитавши довідковий текст різних інструментів, але чи є список вказівок чи щось таке? Наприклад, чи я використовую квадратні дужки або круглі дужки? Як використовувати інтервал? Що робити, якщо аргументом є список? Дякую!


8
Я думаю, що GNU має деякі підказки. Я хотів би подивитися на те, чим займаються більшість комунальних служб GNU.
Василь Старинкевич

1
@DanielPryden Я думаю, що відповідь у цьому питанні трохи оманливий. Він містить посилання, що пояснюють, які комутатори слід приймати, а не як --helpповинен виглядати вихід . Але обидва питання є хорошим кандидатом на об'єднання.
pmr

@pmr: Я згоден - можливо, мод може об'єднати питання до нас.
Даніель Приден

2
Я хотів би подивитися на те, чим займаються більшість комунальних служб GNU, і зробити це іншим способом.
Яків Галка

Відповіді:


160

Як правило, ваш вихідний довідник повинен містити:

  • Опис того, що робить додаток
  • Синтаксис використання, який:
    • Використовує, [options]щоб вказати, куди йдуть варіанти
    • arg_name для необхідного, єдиного аргументу
    • [arg_name] для необов'язкового, єдиного аргументу
    • arg_name... для необхідних аргументів яких може бути багато (це рідко)
    • [arg_name...] для аргументу, для якого можна надати будь-яке число
    • зауважте, що arg_nameмає бути описовим, коротким іменем, в нижньому регістрі змії
  • Добре відформатований список варіантів, кожен:
    • маючи короткий опис
    • показує значення за замовчуванням, якщо воно є
    • показуючи можливі значення, якщо це стосується
    • Зауважте, що якщо опція може прийняти коротку форму (наприклад -l) або довгу форму (наприклад --list), включіть їх разом в одному рядку, оскільки їх описи будуть однаковими
  • Короткий індикатор розташування конфігураційних файлів або змінних середовища, які можуть бути джерелом аргументів командного рядка, наприклад GREP_OPTS
  • Якщо є довідкова сторінка, вкажіть як таку, інакше короткий показник того, де можна знайти більш детальну допомогу

Далі зауважте, що це гарна форма прийняти і те, -hі --helpзапустити це повідомлення, і ви повинні показати це повідомлення, якщо користувач переплутає синтаксис командного рядка, наприклад, не вимагає аргументу.


3
Що робити, якщо у мене є дві форми одного необхідного аргументу? Наприклад , більш стандартний спосіб сказати: usage: move (+|-)pixelsтобто , коли один з + чи - є обов'язковим ? (Я знаю, що у мене можуть бути 2 лінії використання, але мені подобається думка про подвоєння їх з кожним новим аргументом.) Чи можете ви придумати приклад зі стандартного інструменту?
Алоїз Магдал

4
@AloisMahdal я зазвичай бачу {a|b|c|...}в розділах довідки для SysV Init / скриптів вискочка послуг, які вимагають особливої аргумент, один з a, b, cі т.д. Наприклад, service sddmбез аргументу в моїй системі роздруковує Usage: /etc/init.d/sddm {start|stop|status|restart|try-restart|force-reload}. Тому більшість людей, мабуть, зрозуміють usage: move {+|-}pixels}, особливо якщо навести приклад:example: move +5
Бреден Кращий

@JorgeBucaran вони не повинні виходити зі статусом 0, чи не так? Я вважаю, що вихід із статусом 2 є стандартом для недійсних команд оболонки.
інавда

91

Погляньте на docopt . Це формальний стандарт для документування (та автоматичного розбору) аргументів командного рядка.

Наприклад...

Usage:
  my_program command --option <argument>
  my_program [<optional-argument>]
  my_program --another-option=<with-argument>
  my_program (--either-that-option | <or-this-argument>)
  my_program <repeating-argument> <repeating-argument>...

46

Я думаю, що немає стандартного синтаксису для використання командного рядка, але більшість використовують цю конвенцію:

Синтаксис командного рядка Microsoft , IBM має аналогічний синтаксис командного рядка


  • Text without brackets or braces

    Елементи, які потрібно ввести, як показано

  • <Text inside angle brackets>

    Заповнювач місця, для якого потрібно надати значення

  • [Text inside square brackets]

    Необов’язкові предмети

  • {Text inside braces}

    Набір необхідних предметів; Вибери один

  • Вертикальна планка {a|b}

    Роздільник для взаємовиключних предметів; Вибери один

  • Еліпсис <file> …

    Предмети, які можна повторити


16

У нас працює Linux, ОС, сумісна з POSIX. Стандарти POSIX повинні бути: Синтаксис аргументації утиліти .

  • Варіант дефіс слід один алфавітно - цифровий символ, наприклад: -o.
  • Опція може вимагати аргументу (який повинен з’явитися одразу після параметра); наприклад, -o argumentабо -oargument.
  • Опції, які не потребують аргументів, можна згрупувати після дефісу, тому, наприклад, -lstеквівалентно -t -l -s.
  • Параметри можуть з’являтися в будь-якому порядку; таким чином -lst, еквівалентно -tls.
  • Параметри можуть з’являтися кілька разів.
  • Опції передують іншим аргументам -lstпримітки : nonoption.
  • --Аргумент завершує варіанти.
  • Цей -параметр зазвичай використовується для подання одного зі стандартних вхідних потоків.

2
Загальноприйнято, що використання в GNU / Linux не відповідає саме цьому стандарту. Run , наприклад , man aptitudeщо виводить цей (серед іншого): aptitude [<options>...] {add-user-tag | remove-user-tag} <tag> <packages>.... Він містить {і} для прив’язки альтернативних обов'язкових команд. Я думаю (і) можна використовувати так само, як вони використовуються в docopt .
jarno

Ця відповідь буде набагато менш корисною, якщо надане посилання знизиться. Можливо, ви могли б узагальнити важливі частини пов'язаного документа у самій відповіді?
domsson

11

Майкрософт має власну стандартну специфікацію командного рядка :

Цей документ орієнтований на розробників утиліт командного рядка. Наша мета колективно - представити послідовний, компільований досвід користування командним рядком. Досягнення, що дозволяє користувачеві вивчити основний набір понять (синтаксис, іменування, поведінка тощо), а потім змогти перевести ці знання в роботу з великим набором команд. Ці команди повинні мати можливість виводити стандартизовані потоки даних у стандартизованому форматі, щоб забезпечити просту композицію без тягаря розбору потоків вихідного тексту. Цей документ написаний таким чином, щоб він не залежав від конкретної реалізації оболонки, набору утиліт або технологій створення команд; однак додаток J - Використання Windows Powershell для впровадження стандарту командного рядка Microsoft показує, як за допомогою Windows PowerShell безкоштовно забезпечуватиме реалізацію багатьох цих рекомендацій.


9
Microsoft має жахливу допомогу командного рядка для більшості утиліт, все настільки жахливо, що вони змусили Powershell заховати "звичайний" командний рядок під килим.
Каміло Мартін

25
Я не вважаю, що відповідь слід оскаржувати лише тому, що вона має посилання на стандарт Microsoft. "все так жахливо" - це суб'єктивна думка. Таким же чином можна сказати, що командний рядок UNIX жахливий і некрасивий, але давайте не слід залишати такі думки і бути професіоналами.
Діма

2
Погоджено, тому не слід відповідати на цю відповідь. Якщо це заборонено, це повинно бути через те, що: а) розділ документа, який цитується, не відповідає на відповідне питання, і б) документ, на який посилаються, не здається релевантним. Питання задає питання, чи існують стандарти для "довідкового тексту" з великим акцентом на синтаксис, який використовується для передачі конспектів використання команд. У документі не потух такий синтаксис , а скоріше , як побудувати хороші програми командного рядка в цілому в екосистемі PowerShell (наприклад , повинні підтримувати -?, -Help, -Versionі т.д.). Відповідь ІМО Стілі Вінг ближче до позначки.
Марк Г.

9

Стандарт кодування GNU є хорошим посиланням на такі речі. У цьому розділі йдеться про вихід --help. У цьому випадку це не дуже конкретно. Напевно, ви не можете помилитися, надрукувавши таблицю, де відображаються короткі та довгі варіанти та стислий опис. Спробуйте отримати пробіл між усіма аргументами на користь читабельності. Напевно, ви хочете надати manсторінку (а можливо, і infoпосібник) для свого інструменту, щоб дати більш детальне пояснення.


0

так, ти на правильному шляху.

так, квадратні дужки - звичайний показник для додаткових предметів.

Як правило, як ви накреслили, вгорі є резюме командного рядка з подальшими деталями, в ідеалі із зразками для кожного варіанту. (У вашому прикладі показано рядки між описом кожного варіанта, але я припускаю, що це проблема редагування, і що ваша реальна програма виводить перелічені опції списків опцій без порожніх рядків між ними. Це було б стандартом, який слід дотримуватися в будь-якому випадку.)

Більш нова тенденція (можливо, існує специфікація POSIX, яка вирішує це?) - це усунення системи підручних сторінок для документації та включення всієї інформації, яка міститиметься у вкладці як частина program --helpвиводу. Цей додатковий опис буде містити більш довгі описи, пояснені поняття, зразки використання, відомі обмеження та помилки, як повідомити про помилку та, можливо, розділ "див. Також" для відповідних команд.

Я сподіваюся, що це допомагає.


4
Ні-ні-ні. Команда повинна мати керовану сторінку, яка включає повну детальну довідку про використання, і -h|--helpповинна бути лише узагальненою посиланням. Ви також можете включити більш детальну документацію (підручники тощо) на HTML або інформаційні сторінки. Але сторінка повинна бути там!
ніндзяль

Я погоджуюся з вами, @ninjalj, але, як я вже сказав, "новіший тренд", і під цим я маю на увазі дві системи, які я використовую, UWin і MinGW, пішли з вбудованою документацією. Я думаю, що вбудований документ має свої місця, особливо для невеликих сценаріїв на рівні користувача, як те, що пропонує цей користувач. Чи повинен він вивчити nroff та .info? Але добре, що нас чесні, дякую за ваші коментарі та удачу усім.
обстріл

Особисто, коли я набираю someCommand --helpсвою оболонку, все, що мені потрібно, - це невеличке нагадування про точний порядок вступу аргументів, а не гігантський фрагмент тексту, який заповнює екран, і вимагає, щоб я передавав його, щоб lessпросто побачити все це. Сторінка сторінки повинна містити довгий детальний опис, а не текст довідки.
AJMansfield

За словами виробника docopt на своїй конференції, він зазначає, що POSIX має для цього норму.
v.oddou

0

Я б брав за приклад офіційні проекти, як смола. На мій погляд, довідка msg. має бути простим і описовим, наскільки це можливо. Приклади використання теж хороші. Немає реальної потреби в «стандартній допомозі».


Що стосується tar... якщо хтось збирається зробити все-таки богоутиліту, як дьоготь, будь ласка, зробіть короткі перемикачі пам'ятними та включіть в розділ "Приклад використання" --help. 90% часу я переглядаю вказівки дьогтю, це вилучення простого tar.gz.
Каміло Мартін

" Немає реальної потреби в" стандартній допомозі ". "Чи існує якась" реальна потреба "у більшості речей, які ми використовуємо? Або вони просто там, щоб зробити наше життя набагато простішим? Маючи узгоджений спосіб представлення параметрів корисний не тільки для читачів, але й, наприклад, було б корисно для створення людей, наприклад, графічних інтерфейсів, які можуть керувати довільними утилітами командного рядка та хочуть забезпечити елементи керування для їх налаштування. Можливо, є кращі способи використання, які я ще не розглядав.
підкреслюй_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.