Передача варіантів програми: яка умова для одного тире проти двох?


7

Деякі програми приймуть такі варіанти:

$ someprogram -orange apple

І інші програми використовуватимуть щось подібне:

$ otherprogram --orange apple

Чи є в цьому для Linux / Unix / OSX "правило" чи умова для цього?

Відповіді:


22

Найпоширеніший - getoptстиль GNU , з одним тире для коротких варіантів та двома тиреми для довгих варіантів.


  • Спочатку програми Unix брали параметри з однією літерою, які передували одній тире, та необов'язково в комплекті:

    ls -laF
    
    ls -l -a -F
    

    Дві команди вище є рівними.

    Коли параметр приймає значення, він переосмислює групування: In gpg -aofoo.gpg, -aі -oє параметрами, і foo.gpgце значення, яке задається -o.

  • Більшість з них так і зробили.

    tar cvzfє загальним зором. Поточні версії tar -cvzfтеж приймають , і залежно від того, додасте тире, аргументи будуть інтерпретуватися дуже по-різному. Наприклад, ці два означають одне і те ж (зверніть увагу на те, як бездарні варіанти знаходяться не безпосередньо перед їх значенням):

    tar -xf file.tgz -vzO /etc/passwd /var/backups
    
    tar xfvzO file.tgz /etc/passwd /var/backups
    

    BSDps завжди використовує -; SysVps ніколи не робить. Версія Linux приймає обидві версії та змінює свою поведінку залежно від того, чи була опція попередньо встановлена ​​тире. (На відміну від вищевказаного прикладу, ps також змінює значення параметрів .)

  • Програми X11 використовували довгі параметри, яким передував один тире або іноді знак плюс:

    xterm -class FooTerm +vb -u8
    

    Це задає параметри classі u8, і скидає на vbвибір.

    Стиль X11 несумісний з пакетом опцій.

  • Пізніше до GNU були додані довгі опції getopt()таким чином, що сумісний з однобуквенними параметрами.

    gpg -se --no-armor --output=signed.gpg
    

    Це множина -s, -eі --no-armor(що протилежно --armor).

    Зазвичай --output=signed.gpgі --output signed.gpgє рівнозначними. (Але не завжди - наприклад, завиток не приймає перше, лише останнє.)

    (Якщо я пам'ятаю правильно, довгі параметри використовувались +як префікс перед тим, як його було змінено --.)

  • Специфікація POSIX має розділ Синтаксис аргументації утиліти , який описує параметри одного символу.


Більшість програм Windows використовують власні аналізатори, що зводить користувачів з розуму.

  • Одні вимагають /a /b /c, інші дозволяють стиль VMS /a/b/c, а інші віддають перевагу стилю Unix /abc.
  • Більшість використовують /як префікс, деякі також приймають -, інші приймають лише - .
  • Значення можуть бути задані як /foo bar, /foo=bar, /foo:bar.
  • Зазвичай пробіли можуть бути /quoted "like this", але деякі програми сприймають "буквальний характер. (Це є недоліком дозволити програмі робити власне розбиття слів; в Unix це обробляє оболонка.)
  • Для кросплатформних програм може використовуватися реалізація getopt.

1
Ви забули find- напевно, найвідоміше використання варіантів довгих однорядних штрихів.
Денніс Вільямсон

@Dennis: Не соромтесь редагувати =)
grawity

1
У вас система V і BSD psназад; врахуйте, що Linux посилається на параметри --less як сумісні з BSD, а OSX використовував запас BSD psдо Тигра, коли він додав стиль SVID, psа потім зробив його за замовчуванням у Leopard зі стилем BSD, який можна вибрати за допомогою змінної середовища. І поки я не звик до цього (зародившись у Системі III / V стороною речей), FreeBSD продовжував мене відштовхувати ps.
geekosaur

Що стосується цитат, що ви маєте на увазі під "в Unix, це обробляється оболонкою"? Програма отримує "як" і "це" як аргументи, лише використовуючи, наприклад, getoptsце виправить. Ви мали на увазі like\ this?
Даніель Бек

1
@Daniel: Ні В будь-якому Unix - оболонки, "foo bar", 'foo bar'і foo\ barвсе буде результат в одному рядку 7 символів foo barдодається в argvмасив. Цитування та розділення слів завжди обробляються оболонкою перед викликом exec(). Я тестував. (Саме Windows передає непарний командний рядок програмам через CreateProcess().)
grawity

5

Як правило, перший виявляється у старих програмах, які занадто добре закріплені для зміни. Такі довгі варіанти несумісні зі стандартною getopt()функцією.

Другий стиль був введений GNU getopt_long(), і він відповідає існуючим стандартам, які передбачають, що перший стиль буде укомплектований короткими варіантами (тобто, -orangeмабуть, означає -o -r -a -n -g -e). Цей стиль довгого варіанту вкрай переважний.


2
Наскільки я бачив,
умова

Правильно. Це підтримує параметри стилю POSIX / SVID, а також довгі варіанти; перший стиль (використовується в основному програмами з дистрибутива X11) не сумісний.
geekosaur

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