У системах 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
і є багато git
subcommand
іgit
subcommand
--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 тощо.