Яка різниця між єдиними тире та подвійним прапором тире в командах оболонки?


70

Я новачок в роботі оболонки, і використання цих команд здається довільним. Чи є причина, що один прапор має один тире, а інший - подвійний тире?


Це має регулюватися стандартом POSIX: iam.ubc.ca/guides/javatut99/essential/attributes/_posix.html
cjc

Це посилання зараз 404 @cjc :( Можливо, більш надійним посиланням може бути en.wikipedia.org/wiki/POSIX
Бернхард Хофманн

Краще посилання: en.wikipedia.org/wiki/…
Крейг Фішер

Відповіді:


110

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

Розглянемо цей приклад:

tar -czf

У цьому прикладі, -czfвизначають три односимвольних прапори: c, zі f.

Тепер розглянемо інший приклад:

tar --exclude

У цьому випадку --excludeвказується одна опція з багатохарактерним іменем exclude. Подвійний дефіс усуває неоднозначність аргументу командного рядка, гарантуючи , що tarінтерпретує це як , excludeа не поєднання e, x, c, l, u, d, і e.


1
@kylex, ні, оскільки немає довгого варіанту, який називається просто "c", а - означає довгий варіант, не випливає жоден параметр символів.
psusi

13
Іноді навіть довгі команди можуть бути односкладними. Наприклад, 'cdrecord' використовує всі односкладні команди (-eject -dao ...). Все залежить від програми, але більшість (!) З них використовують - для одиночних та - для
багатозначних

8
@mulaz, так, cdrecord робить дуже багато речей.
psusi

10
також майте на увазі - використання самостійно зазвичай означає кінець варіантів. дивіться тут для отримання додаткової інформації: unix.stackexchange.com/questions/11376/…
Sirex

3
@killjoy, бо чи через незнання чи вибір, автори цих програм не дотримувались конвенції, звичайно. Так само, як cdrecordзгадувалося років тому у вищезазначених коментарях.
psusi

17

Все залежить від програми. Зазвичай "-" використовується для "коротких" параметрів (однобуквенна, -h), а "-" використовується для параметрів "long" (er) (--help).

Короткі варіанти зазвичай можна комбінувати (так що "-h -a" те саме, що "-ha")

У системах, схожих на Unix, дефіс ASCII-мінус зазвичай використовується для визначення параметрів. За символом зазвичай супроводжується одна або кілька літер. Аргумент, який є єдиним дефісом-мінусом сам по собі без будь-яких літер, зазвичай вказує, що програма повинна обробляти дані, що надходять зі стандартного вводу, або надсилати дані на стандартний вихід. У деяких програмах два символи дефісу (-) використовуються для вказівки "довгих опцій", де використовуються більш описові назви опцій. Це загальна особливість програмного забезпечення GNU.

джерело


2
То чому ж тоді java -версія та мурашка -версія?
killjoy

7

Це дійсно умовність. Однак це може допомогти парсерам більш ефективно знати варіанти, передані програмі. Крім того, є акуратні утиліти, які можуть допомогти проаналізувати ці команди, такі як getopt(3)або нестандартні getopt_long(3)для розбору аргументів програми.

Це добре, адже у нас може бути кілька коротких варіантів у поєднанні, як говорять інші відповіді tar -xzf myfile.tar.gz.

Якби був аргумент "lisa" для ls, напевно, він мав би інше значення, ls -lisaніж тип ls --lisa. Перші є l, i, sі aпараметри, а не слова.

Насправді ви могли б написати ls -l -i -s -a, значить точно так само, як ls -lisa, але це залежало б від програми.

Є також програми, які не дотримуються цієї конвенції. Найбільше, на мій погляд, ddі gcc.


3

короткі варіанти з одинарним тире і довгі варіанти з подвійним тире

короткі варіанти можна об'єднати в один аргумент;

for example: ls -lrt #instead of ls -l -r -t

Якщо ми дозволяємо довгі варіанти з одним тире, це викликає неоднозначність. Для вирішення цього питання ми використовуємо подвійний тире для довгих варіантів.

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