Деякі програми приймуть такі варіанти:
$ someprogram -orange apple
І інші програми використовуватимуть щось подібне:
$ otherprogram --orange apple
Чи є в цьому для Linux / Unix / OSX "правило" чи умова для цього?
Деякі програми приймуть такі варіанти:
$ someprogram -orange apple
І інші програми використовуватимуть щось подібне:
$ otherprogram --orange apple
Чи є в цьому для Linux / Unix / OSX "правило" чи умова для цього?
Відповіді:
Найпоширеніший - 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
.ps
назад; врахуйте, що Linux посилається на параметри -
-less як сумісні з BSD, а OSX використовував запас BSD ps
до Тигра, коли він додав стиль SVID, ps
а потім зробив його за замовчуванням у Leopard зі стилем BSD, який можна вибрати за допомогою змінної середовища. І поки я не звик до цього (зародившись у Системі III / V стороною речей), FreeBSD продовжував мене відштовхувати ps
.
getopts
це виправить. Ви мали на увазі like\ this
?
"foo bar"
, 'foo bar'
і foo\ bar
все буде результат в одному рядку 7 символів foo bar
додається в argv
масив. Цитування та розділення слів завжди обробляються оболонкою перед викликом exec()
. Я тестував. (Саме Windows передає непарний командний рядок програмам через CreateProcess()
.)
Як правило, перший виявляється у старих програмах, які занадто добре закріплені для зміни. Такі довгі варіанти несумісні зі стандартною getopt()
функцією.
Другий стиль був введений GNU getopt_long()
, і він відповідає існуючим стандартам, які передбачають, що перший стиль буде укомплектований короткими варіантами (тобто, -orange
мабуть, означає -o -r -a -n -g -e
). Цей стиль довгого варіанту вкрай переважний.
find
- напевно, найвідоміше використання варіантів довгих однорядних штрихів.