Стиль параметрів командного рядка - POSIX чи що?


16

Десь я побачив злобу проти java / javac, нібито використовуючи суміш стилів Windows та Unix

java -classpath ... -ea ... Something

ІМХО, це не мікс, це так само, як findпрацює, чи не так? AFAIK, згідно POSIX, синтаксис повинен бути таким

java --classpath ... --ea ... Something

і -abcdef означатиме одночасно вказати 6 коротких варіантів. Цікаво, яка версія в цілому призводить до меншого набору тексту та менше помилок.

Я пишу невелику утиліту на Java, і ні в якому разі не буду користуватися стилем Windows, /a /bоскільки мене цікавить насамперед Unix. Який стиль вибрати?


1
POSIX 1003.1-2003, Основні визначення, Глава 12, Розділ 2, наводяться такі вказівки щодо синтаксису командного рядка утиліти: "Кожне ім'я параметра має бути одним алфавітно-цифровим символом (класифікація символів alnum) з набору переносних символів." та "Усі параметри повинні передувати символу" - "роздільник."
Грег А. Вудс

Відповіді:


21

Ви можете знайти умовності аргументу POSIX в Підсобних конвенціях розділі . Стиль POSIX складається з параметрів з одним тире, за яким йде одна буква, що вказує на варіант, причому значення аргументу відокремлено від параметра пробілом.

findНаприклад, існують винятки з правил - але це через історичні прецеденти Unix.

X Windows (X11) використовує findоднотипні параметри з довгими назвами.

Параметри довгого назви з подвійним тирем були запроваджені GNU (після обходу, використовуючи +як префікс).

Дивіться це питання StackOverflow для обговорення широкого спектру відомих систем обробки аргументів командного рядка - їх багато. ( Оскільки це було написано, питання про повноваження, яке повинно бути вирішено, питання SO 367309 не підходить для SO. Я переніс відповідь на інше питання: Що таке загальний синтаксис команди оболонки Unix? . )

Ви можете розширити список методів, щоб охопити git(та ряд інших систем), де ви отримали структуру на зразок:

  • basecommand[ глобальні параметри ] subcommand[ параметри підкоманд ] [ім'я ...]

Підкоманд може бути багато, кожен має свій лексикон варіантів.

Звичайно, Windows використовує (використовується) косу рису " /", щоб вказати параметри замість тире "- ".

JCL (для z / OS, OS / 360 та проміжних систем), як правило, використовує позиційні параметри, розділені комами, і, як правило, вважається не зручним для користувача чи хорошим інтерфейсом.


1
+1 За приємні посилання та згадування git.
maaartinus

Мені подобаються всі відповіді, цю цю прийняли через посилання.
maaartinus

Питання stackoverflow, здається, було видалено (або можливо, переміщено) ... хтось знає, куди він пішов? Мені цікаво це прочитати.
mizipzor

1
@mizipzor: Дивіться оновлення для поточного місцезнаходження інформації. Дивіться також Короткі / довгі варіанти з аргументом опціону - це якась умовність?
Джонатан Леффлер

"Звичайно, Windows використовує (використовується) косу рису" / ", щоб вказати параметри замість тире" - "." Більшість інструментів командного рядка Windows зараз підтримують і те, і інше, і PowerShell піде шляхом використання лише тире.
jpmc26

15

EDIT: Вказувалося, що цей стиль є GNU-ізмом, і що Unixes, що не базується на GNU, прагнуть використовувати синтаксис з одним тире (зокрема, варіанти OS X та BSD).

Незважаючи на статус GNU-ism, багато щойно написаних програм у стилі Unix використовують цей стиль:

  • --long-option для довгих імен варіантів,
  • -s для коротких (односимвольних) варіантів,
  • -abc для декількох коротких варіантів без аргументів (один символ на варіант).
  • Варіанти з аргументами:
    • --long arg або --long=arg для довгих варіантів,
    • -s arg, -sargАбо ( за бажанням) -s=argдля коротких опцій. Це може поєднуватися з іншими короткими варіантами, якщо аргумент має лише останній.
  • Один і той же «семантичний» варіант може мати декілька псевдонімів, найчастіше короткий (швидший набрати) та довгий (простіше запам’ятати).

Кожен, хто використовував оболонку Linux протягом певного часу, повинен бути знайомий з цим стилем 1 , тому він має принцип найменшого здивування на своїй стороні. Доречно також дозволити групування декількох коротких варіантів без неоднозначності з довгими варіантами.

1 Наприклад, деякі програми, що використовують цей стиль (на моїй машині Linux):ls , grep, man, sed, bashі т.д. ( EDIT: це мабуть GNU-ізми , хоча, BSD і OS X машина не використовує цей стиль)

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

findце дуже стара програма (або, можливо, більше ймовірність: переписана версія дуже старої програми), яку неможливо легко змінити для використання нового синтаксису командного рядка. Забагато сценаріїв зламається, і занадто багато користувачів, звикли до старого синтаксису, скаржиться. javacймовірно, під впливомgcc і друзі, які також слідують старовинному синтаксису з історичних причин.


+1 - Крім того, коли у вас є сотні варіантів, вам просто потрібно проявити творчість (наприклад, під час написання компілятора)
Tim Post

1
Ви створюєте враження, що всі Unices використовують утиліти GNU (тобто аргументи dash-dash), і це неправильно. Mac OS X не підтримує їх, і те саме стосується Free BSD.
Мартін Вікман

8
  • Аргумент за допомогою dash-dash ( --long-arg) є конвенцією GNU (див. Їх реалізацію getopt ).
  • Команди POSIX ніколи не використовують аргументи подвійного тире. Це стосується більшості варіантів Unix (Mac OS X, BSD) за винятком Linux, який за замовчуванням використовує GNU.

Для вашого Java проекту ви можете перевірити GNU getopt для Java або Apache CLI . Вони підтримують обидві конвенції.

Третій варіант - використовувати аргументи Java VM і дозволити виконувати їх час для вас:

 $ java -Dcolor=blue

А потім у коді:

 System.getProperty("color");

Особисто я б використовував -Dідіому і загортав заклик Java в сценарій оболонки, який обробляє розбір командного рядка, включаючи перевірку classpath і т. Д. Це також спрощує вихідним користувачам запуск вашої програми Java.


1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.