У системах POSIX (наприклад, Linux, MacOSX), принаймні для програм, можливо, запущених у терміналі оболонки (наприклад, більшість з них), я рекомендував би скористатися умовами кодування GNU (де також перелічені загальні назви аргументів) і переглянути інструкції щодо утиліт POSIX. , навіть для власного програмного забезпечення:
завжди обробляти --versionі--help (навіть /bin/trueприймає їх !!). Я проклинаю, що автори програмного забезпечення не розуміють --help, я ненавиджу їх (адже prog --help це перша команда, яку я пробую над новою програмою)! Часто --helpйого можна скоротити як-h
Повідомте --helpперелік усіх параметрів (якщо у вас їх занадто багато ... у цьому випадку перерахуйте найпоширеніші з них і явно посилайтесь на якусь manсторінку чи якусь URL-адресу) та значення за замовчуванням параметрів, можливо, важливі (і залежать від програми ) змінні середовища. Показати ці списки опцій при помилці аргументу опції.
прийняти -aкороткий аргумент (одна буква) і мати певний еквівалент --long-argument, тому -a2 --long-argument=2, --long-argument 2; звичайно, ви могли б мати (для рідко використовуваних варіантів) --only-long-argumentназву; для модальних аргументів без додаткових варіантів, -cfяк правило, обробляється як -c -fтощо, тому ваша -argument:valueпропозиція дивна, і я не рекомендую цього робити.
використовувати GLIBC getopt_long або краще (наприклад, argp_parse , в OCaml це Argмодуль , ...)
часто використовуйте -для стандартного вводу або виводу (якщо ви цього не можете, обробляйте /dev/stdinі /dev/stdoutнавіть у кількох операційних системах, які їх не мають)
імітують поведінку подібних програм , використовуючи більшість конвенцій про їх варіанти; зокрема -nдля сухого пробігу (а-ля make), -hдля допомоги, -vбагатослівності тощо ...
використовувати --як роздільник між параметрами та файлом чи іншими аргументами
якщо ваша програма використовує isattyдля тестування, ніж stdin є терміналом (і в такому випадку поводиться "інтерактивно"), надайте можливість застосувати неінтерактивний режим, також якщо ваша програма має інтерфейс GUI (і тести getenv("DISPLAY")на робочому столі X11), але також може використовуватись у пакетному чи командному рядку.
Деякі програми (наприклад gcc) приймають непрямі списки аргументів, @somefile.txtтобто означає читати аргументи програми з somefile.txt; це може бути корисно, коли ваша програма може прийняти дуже багато аргументів (більше, ніж ваших ядер ARG_MAX)
До речі, ви можете навіть додати деякі автоматичні засоби для вашої програми та звичайні оболонки (наприклад, bashабо zsh)
Деякі старі команди Unix (наприклад dd, або навіть sed) мають дивні аргументи команд для історичної сумісності. Я б рекомендував не дотримуватися їх шкідливих звичок (якщо ви не робите якийсь кращий їх варіант).
Якщо ваше програмне забезпечення являє собою ряд взаємопов'язаних програм командного рядка, черпає натхнення з мерзотника (який ви , звичайно , використовувати в якості інструменту розвитку), який приймає git helpі git --helpі є багато gitsubcommandіgitsubcommand--help
У рідкісних випадках ви також можете використовувати argv[0](за допомогою символьних посилань у вашій програмі), наприклад, bashвикликається, оскільки rbashмає іншу поведінку ( обмежена оболонка). Але я зазвичай не рекомендую цього робити; це може мати сенс, якщо ваша програма може використовуватися як інтерпретатор скриптів за допомогою shebang, тобто #!на першому рядку, інтерпретованому execve (2) . Якщо ви робите такі хитрощі, обов’язково задокументуйте їх, у тому числі в --helpповідомленнях.
Пам'ятайте , що на POSIX оболонка є підстановкою аргументів ( перед тим запуском програми!), Тому не вимагають символів (наприклад , *чи $або ~) в варіантах , які повинні були б бути шкаралупою маскування.
У деяких випадках ви можете вбудовувати в своє програмне забезпечення такого перекладача, як GNU guile або Lua (уникайте вигадування вашої власної мови сценаріїв, повного Тьюрінга, якщо ви не знаєте мов програмування). Це має глибокі наслідки для дизайну вашого програмного забезпечення (так слід думати про ранні терміни!). Тоді ви повинні легко мати можливість передати певний сценарій або якийсь вираз цьому інтерпретатору. Якщо ви ставитесь до цього цікавого підходу, обережно розробіть програмне забезпечення та його інтерпретовані примітиви; у вас можуть бути якісь дивні користувацькі кодування великих сценаріїв для вашої речі.
В інших випадках ви можете дозволити своїм досвідченим користувачам завантажувати свій плагін у ваше програмне забезпечення (використовуючи динамічні методи завантаження à la dlopen& dlsym). Знову ж таки, це дуже важливе дизайнерське рішення (тому обережно визначте і документуйте інтерфейс плагіна), і вам потрібно буде визначити умову для передачі програмних параметрів цим плагінам.
Якщо ваше програмне забезпечення є складною справою, змусьте його приймати деякі конфігураційні файли (на додаток або заміну програмних аргументів) і, ймовірно, є якийсь спосіб перевірити (або просто проаналізувати) ці файли конфігурації, не запускаючи весь код. Наприклад, агент передачі пошти (наприклад, Exim або Postfix) є досить складним, і корисно мати можливість «напівсухо» запустити його (наприклад, спостерігати за тим, як він обробляє певну адресу електронної пошти, фактично не надсилаючи електронну пошту).
Зауважте, що /optionце річ Windows або VMS. Це було б божевільно в системах POSIX (тому що ієрархія файлів використовує /як сепаратор каталогів і тому, що оболонка робить глобальну). Вся моя відповідь здебільшого стосується Linux (та POSIX).
PS Якщо можливо, зробіть свою програму безкоштовним програмним забезпеченням , ви отримаєте вдосконалення від деяких користувачів та розробників (а додавання нового варіанту програми часто є однією з найпростіших речей, яку можна додати до наявного безкоштовного програмного забезпечення). Крім того, ваше питання багато в чому залежить від передбачуваної аудиторії : гра для підлітків або браузер для бабусі, ймовірно, не потребують такого ж виду і кількості варіантів, як компілятор, або мережевий інспектор системних центрів обробки даних, або програмне забезпечення САПР для мікропроцесора архітекторів або для дизайнерів мостів. Інженеру, знайомому з програмуванням та написанням сценаріїв, напевно, подобається набагато більше, що має багато настроюваних варіантів, ніж ваша бабуся, і, напевно, може захотіти запустити вашу програму без X11 (можливо, в crontabроботі).
ls -ltrкомбінувати варіанти-l,-tі-r. Програми в стилі GNU також зазвичай дозволяють базуватися на словах із подвійним дефісом як--reverseзамість-r. Є й інші популярні конвенції, як-hпоказати допомогу,--подати сигнал про закінчення параметрів, вказавши-як ім'я файлу, щоб дозволити читати з stdin тощо.