Яка різниця між параметрами командного рядка та двома тиреми?


65

Мені було цікаво, чому так, що деякі програми вимагають, щоб їх параметри командного рядка мали два тире попереду, тоді як для деяких (більшості) потрібен лише один тире попереду?

Наприклад, більшість програм виглядають так: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Тоді як деякі програми виглядають так: xmllint --valid toc.xml --noout

У чому причина, що для деяких потрібні два тире замість одного? Чи не має сенсу кожен дотримуватися одного стандарту (тобто, один тире буде робити).


10
> Чи не має сенсу кожен дотримуватися одного стандарту - так. Чи всі програмісти дотримуються стандартів і зберігають послідовність? Ні. Багато програмістів навіть не можуть підтримувати послідовність у своїх програмах :) При цьому, консенсусом було б використовувати один тире лише для однолітерних варіантів, і два тире для всіх, що насправді є словами, наприклад, -iпроти --inputабо -n --dry-run.
slhck

1
@slhck Heys спасибі за допомогу =) Тоді, якщо це умова, це означає, що це -dtdмало бути насправді --dtd? Ефективно, про що мені було цікаво - це те, що намагається позначити тире (і подвійний тире) ?
Pacerier

6
Для бонусних балів: програми, що відповідають стандартам Gnu для, --long-optionsтакож приймають будь-яку унікальну абревіатуру. Таким чином, для програми з опціями --file-inта --file-out, ви можете використовувати --file-o=fooабо --file-i=foo, що може зберегти певний текст --very-long-optional-parameters.
BRPocock

GNU прийшли разом з їх конвенцією з допомогою двох рисок для «довгих» варіантів, які я , трапляється, вважаю за краще, але багато старих утиліти, такі як ті , які в комплекті з системою X Window, а також ImageMagick ( наприклад , convert, mogrify) є «довгі» параметри, що використовують лише один тире. Наприклад: xterm -fn 6x10 -geometry 80x24+30+200. Скорочення підтримуються, якщо вони відрізняються ( наприклад , -gабо -geomдля -geometry). Див. X (7) для інших прикладів.
TheDudeAbides

Відповіді:


18

Просто зробіть ls --help і подивіться на варіанти; це повинно бути вам очевидно.

Це взагалі не має нічого спільного з параметрами. Багато варіантів мають коротку форму і довгу форму, а багато - один, а не другий.

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

Ось витяг із ls --help( man lsдає еквівалентну інформацію). Зверніть увагу на те, як деякі з них мають довгу форму без короткої форми ( --author, --block-size), деякі з них мають коротку форму без довгої форми ( -c, -f, -g), а деякі з них як довгої форми і коротка форма ( -A/ --almost-all, -b/ --escape).

 -a, --all                  do not ignore entries starting with .
 -A, --almost-all           do not list implied . and ..
     --author               with -l, print the author of each file
 -b, --escape               print octal escapes for nongraphic characters
     --block-size=SIZE      use SIZE-byte blocks
 -B, --ignore-backups       do not list implied entries ending with ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'

4
Як ми робимо ls --helpвікно?
Pacerier

1
@Pacerier У lsWindows немає . Еквівалентна команда була б dir /?. Ви використовуєте кросплатформене програмне забезпечення, яке порушує звичні умови Windows, дивіться мою відповідь.
Даніель Бек

@Pacerier Він не вбудований, але завантажте його третьою стороною, Gnuwin32 ви завантажите його (google gnuwin32). в gnuwin32 є купа пакетів, кожен з командами, завантажте пакунок coreutils, який має багато загальних команд.
барлоп

У вашому ls --helpуривку є довгі варіанти без коротких варіантів . Дивіться --authorі --block-size.
День

Щоб відповісти на запитання в оригінальному коментарі @ Pacerier: Найпоширеніший спосіб отримання сучасних систем Windows отримує lsкоманду через GIT . Оболонка bash GIT або вікно CMD з бітом GIT в PATH матимуть ls.
yzorg

34

Широкого стандарту немає. Наприклад, в програмах GNU є певна послідовність, але вам потрібно перевірити документацію кожної програми.

Цитуючи Вікіпедію , моє наголос:

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

Зазвичай дефіси вказують на попередньо визначений аргумент. Я думаю, що використовується для їх розмежування, наприклад, назви файлів чи інших міток, які ви можете використовувати як аргументи. Це не завжди так (див. Нижче).


Часто ви знайдете один і той же аргумент, як короткий, так і довгий варіант, наприклад, у ls .

Деякі програми використовують один дефіс для односимвольних варіантів та два дефіси для багатозначних варіантів, але не всі (GNU findприходить на думку). Деякі програми мають необов'язкові дефіси або взагалі пропускають їх ( tarабо psна думку BSD ).

Іноді довгі параметри ( --foo) вимагають аргументів, тоді як короткі параметри ( -f) не (або принаймні передбачають конкретний аргумент за замовчуванням).

Короткі параметри (наприклад cut -d ' ') можуть мати аргументи, тоді як довгі варіанти (наприклад ls --all) не обов'язково їх мають.

Щоб встановити певну поведінку програми, іноді потрібно використовувати короткий варіант, для інших потрібно скористатися довгим варіантом, а для деяких - вибір.

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

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

Ви дійсно не можете зробити синтаксис аргументів однієї програми з іншого.


Якщо ви також вважаєте Windows, це стає ще гіршим: хоча виклики командного рядка Windows традиційно використовують /f(принаймні більшу частину часу, одиночні символи) для опцій, з :роздільником між параметрами та їх значенням (див., Наприклад, тут ); крос-платформні утиліти широко розповсюджені (наприклад, ті, які ви згадуєте), і містять більш поширений дефіс синтаксис аргументів, з усіма невідповідностями, згаданими вище.


2
Слід зазначити, що стандартні бібліотеки GNU забезпечують функціональне відображення параметрів «один-мінус-один-літер», «два-мінус-багато-літери», тому всі нові програми GNU та більшість нових вільних програм в цілому використовують це позначення (наприклад, f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); повернення , такі як tar, ps, findі такі були їх синтаксис командного рядка , встановлений POSIX , перш ніж цей стандарт був повністю загущеним. В системі GNU / Linux, це досить безпечно тримати парі , що по крайней мере , --helpбуде (майже) завжди підтримується, а також man <command>чиinfo <command>
BRPocock

чи говорить стандарт GNU, що у вас не повинно бути короткої форми без довгої форми і не повинно бути довгої без короткої форми?
барлоп

+1 за найповнішу відповідь, включаючи згадку про GNU, findякий не відповідає "конвенції GNU" для довгих варіантів (можливо, з причин відповідності POSIX, як вказував @BRPocock). Я б ще раз поставив +1, якби міг, для згадування "перемикачів" командного рядка DOS / Windows, оскільки питання ОП якось позначено "вікнами", і цю конвенцію слід згадати для повноти.
TheDudeAbides

7

Це умова, що походить від * nix. Подвійний дефіс передує опціям, коли вони написані повністю , а одинарний дефіс передує варіантам, коли вони написані у короткій формі . Наприклад ls --all --l, можна скоротити до ls -al. Як видно, не всі варіанти мають свої однолітерні еквіваленти, хоча зазвичай використовуються більш вживані.

Якщо параметр бере аргумент, насправді не має значення - він може або приймати їх, або не приймати, незалежно від способу введення параметра.

Коли ви пишете їх одноразово, це насправді не має значення, але при написанні команд, наприклад, у файлах .alias, звичайно використовувати повну форму. Чисто для зручності читання для наступної людини.


Вітаю, дякую за допомогу, Btw, є причина, коли ти вводиш unix як * nix?
Pacerier

2
@Pacerier - Unix - торгове найменування. Вводячи * nix, я фактично маю на увазі всі Unix та подібні системи, які для всіх практичних цілей однакові. Але здебільшого це сила звички ...
Грач

2
@Pacerier * nix може посилатися на Linux або Unix. Я не зовсім впевнений, що це було, тому що я заглянув у нього, але технічно, якщо я пригадую, BSD - з родини Unix. Linux технічно не є .. і це також FreeBSD. Але сказати * nix буде включати unix / bsd і все подібне, наприклад, Linux та freebsd.
барлоп

2
+1 для згадування комбінації скорочень команд. це справжня причина, чому існує два стилі.
Ryan_S

3

це звичайні синтаксиси UNIX,

програмний аргумент приймає один дефіс ("-"), який супроводжується однією буквою, коли це простий варіант (наприклад: -v ) та два дефіси ("-"), коли параметр бере аргументи (наприклад: --file toc.xml або --file = toc.xml )

не впливає на функціональність програми.


3
Крім того, у багатьох випадках, використовуючи параметри однієї літери після одного тире, ви можете згрупувати букви разом. Наприклад, "ls -al" те саме, що "ls -a -l". Параметри подвійного тире не можна поєднувати таким чином. Параметри з однією літерою - це старший стандарт, але в наші дні багато команд приймуть обидва типи. Наприклад, "ls - всі" - це те саме, що "ls -a".
Ренді Оррісон

3
Власне, ще одна корекція. Однорядкові однолітерні параметри можуть приймати параметр, але він зазвичай не пов'язаний зі знаком рівності. Наприклад, "хвіст -n 50" показує останні 50 рядків файлу, еквівалентні "tail --lines = 50".
Ренді Оррісон

Чи означає це, що ця конвенція означає, що --noout(у вищезазначеному питанні) насправді слід писати так, як -nooutне має аргументів ?
Pacerier

1
те, що сказано у цій відповіді про параметри, абсолютно неправильно. Перше речення очевидно. Останнє речення очевидно. А абзац посередині, який повинен відповісти на запитання, абсолютно помилковий.
барлоп

@RandyOrrison, коли в одній букві я ніколи не бачив знак рівності .. і щоб детальніше сказати, вони часто приймають параметри .. wget -w 10 head -n 3 cut -b 2 І подивіться на Ping -? !! Навантаження приймають параметри. Ця відповідь жахлива
барлоп

3

одиночний тире реалізований методом getopt і є стандартною функцією posix, подвійний тире в getopt_long і є стандартом gnu.

Традиційно один тире надає такий варіант символу, як цей:

-A або -V тощо, але не потрібно обмежуватися цим. наприклад -Wall для gcc включає всі попередження компілятора для команди компілятора gcc.

Аргументи подвійного тире, як правило, більш багатослівні і часто приймають доданий параметр, наприклад --max-count = NUM. Однак --версія не має рівних.

Взагалі кажучи, немає правил чи визначених стандартів щодо того, як слід визначати аргументи програми, лише купа традицій. Однак якщо використовуються функції розбору командного рядка getopt та getopt_long, то параметри, як правило, повинні відповідати стандарту, оскільки функції бібліотеки застосовують певний спосіб цього робити.

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