Qual è la differenza tra un trattino e due trattini per i parametri del prompt dei comandi?


65

Mi chiedevo perché alcuni programmi richiedono che i loro parametri del prompt dei comandi abbiano due trattini davanti mentre alcuni (la maggior parte) richiedono solo un trattino davanti?

Ad esempio la maggior parte dei programmi si presenta così: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Considerando che alcuni programmi assomigliano a questo: xmllint --valid toc.xml --noout

Qual è il motivo per cui alcuni richiedono due trattini anziché uno? Non ha senso che tutti rispettino uno standard (vale a dire un singolo trattino).


10
> Non ha senso che tutti rispettino uno standard - sì. Tutti i programmatori aderiscono agli standard e mantengono la coerenza? No. Molti programmatori non riescono nemmeno a mantenere la coerenza all'interno dei loro programmi :) Detto questo, il consenso sarebbe di usare un trattino solo per le opzioni di una lettera e due trattini per tutto ciò che in realtà sono parole, ad esempio -ivs. --inputo -n --dry-run.
slhck,

1
@slhck Heys grazie per l'aiuto =) In base a quella convenzione allora, significa che -dtdavrebbe dovuto essere davvero --dtd? In effetti, quello che mi chiedevo è cosa significa che il trattino (e il doppio trattino) stanno cercando di indicare?
Pacerier,

6
Per i punti bonus: anche i programmi conformi agli standard Gnu --long-optionsaccettano qualsiasi abbreviazione unica. Quindi, per un programma con opzioni --file-ine --file-out, è possibile utilizzare --file-o=fooo --file-i=foo, che consente di risparmiare un po 'di battitura --very-long-optional-parameters.
BRPocock,

GNU è arrivato con la loro convenzione di usare due trattini per le opzioni "lunghi", che mi capita di preferire, ma molti programmi di utilità più grandi, come quelli in bundle con il sistema X Window, così come ImageMagick ( ad esempio , convert, mogrify) hanno "lungo" opzioni usando solo un trattino. Ad esempio: xterm -fn 6x10 -geometry 80x24+30+200. Le abbreviazioni sono supportate, a condizione che siano distinte ( ad esempio , -go -geomper -geometry). Vedi X (7) per altri esempi.
TheDudeAbides il

Risposte:


18

Basta fare ls --help e guardare le opzioni; dovrebbe essere ovvio per te.

Non ha nulla a che fare con i parametri. Molte opzioni hanno una forma breve e una forma lunga, e molte hanno una e non l'altra.

Inoltre, per quanto riguarda i parametri, è semplicemente che nella forma lunga quando assumono un parametro sembra che sia sempre con un uguale. Ma ovviamente quelli brevi possono assumere parametri altrettanto; solo che non usano un uguale.

Ecco un estratto da ls --help( man lsfornisce informazioni equivalenti). Si noti come alcuni hanno una lunga forma senza una forma breve ( --author, --block-size), in alcuni casi, una forma breve, senza una forma lunga ( -c, -f, -g), e alcuni hanno entrambi una forma lunga e una forma breve ( -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
Come facciamo un ls --helpsu windows?
Pacerier,

1
@Pacerier Non c'è lssu Windows. Il comando equivalente sarebbe dir /?. Stai utilizzando un software multipiattaforma che viola le solite convenzioni di Windows, vedi la mia risposta.
Daniel Beck

@Pacerier Non è integrato, ma scaricalo di terze parti, Gnuwin32 lo scarichi (google gnuwin32). ci sono un sacco di pacchetti all'interno di gnuwin32 ciascuno con comandi, scarica il pacchetto coreutils, che ha molti comandi comuni.
barlop

Ci sono opzioni lunghe senza opzioni brevi nel tuo ls --helpestratto. Vedi --authore --block-size.
Dan,

Per rispondere alla domanda nel commento originale di @ Pacerier: il modo più comune in cui i moderni sistemi Windows ottengono il lscomando è tramite GIT . Avrà la shell bash GIT o la finestra CMD con bin GIT nel PERCORSO ls.
yzorg,

34

Non esiste uno standard diffuso. C'è una certa coerenza, ad esempio nei programmi GNU, ma è necessario controllare la documentazione di ciascun programma.

Citando Wikipedia , sottolineo il mio:

Nei sistemi simili a Unix, il trattino ASCII-meno è comunemente usato per specificare le opzioni. Il personaggio è generalmente seguito da una o più lettere . Un argomento che è un singolo trattino da solo senza lettere di solito specifica che un programma dovrebbe gestire i dati provenienti dall'input standard o inviare i dati all'output standard. Due trattini-meno (-) vengono utilizzati su alcuni programmi per specificare "opzioni lunghe" in cui vengono utilizzati nomi di opzioni più descrittivi . Questa è una caratteristica comune del software GNU.

Di solito, i trattini indicano un argomento predefinito. Penso che sia usato per differenziarli ad esempio da nomi di file o altre etichette che potresti usare come argomenti. Questo non è sempre il caso (vedi sotto).


Troverai spesso lo stesso argomento disponibile sia come opzione corta che lunga, come ad esempio in ls .

Alcuni programmi usano un solo trattino per le opzioni a un carattere e due trattini per le opzioni a più caratteri, ma non tutti (mi findviene in mente GNU ). Alcuni programmi hanno trattini opzionali o li saltano del tutto ( taro mi psviene in mente BSD ).

A volte le opzioni lunghe ( --foo) richiedono argomenti, mentre le opzioni brevi ( -f) non lo fanno (o almeno implicano un argomento predefinito specifico).

Le opzioni brevi (ad es. cut -d ' ') Possono avere argomenti, mentre le opzioni lunghe (ad es. ls --all) Non le hanno necessariamente.

Per impostare un comportamento particolare di un programma, a volte è necessario utilizzare un'opzione breve, per altri è necessario utilizzare un'opzione lunga e per alcuni è possibile scegliere.

In una nota correlata, alcuni programmi non possono gestire spazi bianchi tra un'opzione e il suo argomento , mentre altri no.

Come ho scritto all'inizio, non esiste un comportamento o uno standard comune. Spesso è possibile tracciare un comportamento simile alla stessa libreria utilizzata per l'analisi degli argomenti, ma probabilmente non si desidera leggere le fonti per scoprirlo.

Non si può davvero dedurre la sintassi dell'argomento di un programma da quella di un altro.


Se consideri anche Windows, la situazione peggiora ancora: mentre le chiamate da riga di comando di Windows usano tradizionalmente /f(almeno la maggior parte delle volte, caratteri singoli) per le opzioni, con :come separatore tra le opzioni e il loro valore (vedi ad esempio qui ); i programmi di utilità multipiattaforma sono molto diffusi (come quelli citati) e portano la sintassi del trattino più comune per gli argomenti, con tutte le incoerenze sopra menzionate.


2
Va notato che le librerie standard GNU forniscono la funzionalità di mappatura delle opzioni da una meno a una lettera, da due meno una multi-lettera, quindi tutti i nuovi programmi GNU e la maggior parte dei nuovi software gratuiti in generale usano questa notazione (ad es. f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); throwbacks quali tar, ps, finde tale avuto la loro sintassi di riga di comando impostato POSIX prima questo standard era completamente gelificata. Su un sistema Gnu / Linux, è una scommessa ragionevolmente sicura che almeno --helpsarà (quasi) sempre supportato, così come man <command>oinfo <command>
BRPocock,

lo standard GNU dice che non dovresti avere una forma breve senza una forma lunga e non dovresti avere una forma lunga senza una forma breve?
barlop

+1 per essere la risposta più completa, inclusa la menzione di GNU findche non segue la "convenzione GNU" per lunghe opzioni (probabilmente per motivi di conformità POSIX, come sottolineato da @BRPocock). Vorrei fare +1 di nuovo se potessi, per menzionare "switch" della riga di comando DOS / Windows, poiché la domanda dell'OP in qualche modo è stata taggata "windows" e tale convenzione dovrebbe essere menzionata per completezza.
TheDudeAbides il

7

Questa è una convenzione proveniente da * nix. Il doppio trattino precede le opzioni quando sono scritte per intero , mentre il singolo trattino precede le opzioni quando sono scritte in forma abbreviata . Ad esempio ls --all --l, può essere abbreviato in ls -al. Come si vede, non tutte le opzioni hanno i loro equivalenti a lettera singola, sebbene di solito ne usino di più.

Il fatto che l'opzione accetti un argomento non fa davvero la differenza: può prenderli o meno, indipendentemente dal modo in cui si immette l'opzione.

Quando li scriviamo per un utilizzo una sola volta, non importa, ma quando si scrivono comandi, ad esempio nei file .alias, è consuetudine utilizzare il formato completo. Puramente per la facilità di lettura per la persona successiva.


Ehi, grazie per l'aiuto, a proposito c'è un motivo per cui digiti unix come * nix?
Pacerier,

2
@Pacerier - Unix è un nome commerciale. Digitando * nix in realtà mi riferisco a tutti i sistemi unix e simili, che per tutti gli scopi pratici sono gli stessi. Ma soprattutto, è una forza dell'abitudine ...
Rook,

2
@Pacerier * nix può fare riferimento a Linux o Unix. Non sono del tutto sicuro su questo perché un po 'di tempo fa ci avevo guardato dentro, ma tecnicamente, se ricordo, BSD è della famiglia Unix. Linux tecnicamente non è ... e nemmeno FreeBSD. Ma dire * nix includerebbe unix / bsd, e qualcosa di simile, ad esempio linux e freebsd.
barlop

2
+1 per menzionare la combinazione di comandi abbreviati. questa è la vera ragione per cui ci sono due stili.
Ryan_S,

3

queste sono sintassi UNIX convenzionali,

un argomento del programma accetta un trattino ("-") seguito da una singola lettera quando è un'opzione semplice (ad esempio: -v ) e due trattini ("-") quando l'opzione accetta argomenti (ad esempio: --file toc.xml o --file = toc.xml )

nessun impatto sulla funzionalità del programma.


3
Inoltre, in molti casi con opzioni a lettera singola che seguono un trattino singolo, è possibile raggruppare le lettere. Ad esempio, "ls -al" è uguale a "ls -a -l". Le opzioni a doppio trattino non possono essere combinate in questo modo. Le opzioni a lettera singola sono uno standard precedente, ma oggigiorno molti comandi accettano entrambi i tipi. Ad esempio "ls --all" è uguale a "ls -a".
Randy Orrison,

3
In realtà, un'altra correzione. Le opzioni a lettera singola a trattino singolo possono accettare un parametro, ma di solito non è collegato con un segno di uguale. Ad esempio, "tail -n 50" mostra le ultime 50 righe di un file, equivalenti a "tail --lines = 50".
Randy Orrison,

Con questa convenzione, significa che --noout(nella domanda sopra) avrebbe dovuto essere davvero scritto -nooutperché non ha argomenti ?
Pacerier,

1
ciò che viene detto in questa risposta sui parametri è totalmente sbagliato. La prima frase è ovvia. L'ultima frase è ovvia. E il paragrafo nel mezzo che dovrebbe rispondere alla domanda, è totalmente sbagliato.
barlop,

@RandyOrrison quando una sola lettera non ho mai visto un segno di uguale .. e per elaborare il tuo punto, spesso prendono parametri .. wget -w 10 head -n 3 cut -b 2 E guarda Ping -? !! I carichi accettano parametri. Questa risposta è terribile
barlop il

3

single dash è implementato da getopt ed è la funzione standard posix, double dash in getopt_long ed è uno standard gnu.

Tradizionalmente, un singolo trattino fornisce un'opzione a carattere singolo come questa:

-A o -V ecc. Ma non è necessario limitarsi a quello. eg -Wall for gcc attiva tutti gli avvisi del compilatore per il comando compilatore gcc.

gli argomenti a trattino doppio tendono ad essere più dettagliati e spesso accettano un parametro fornito come --max-count = NUM. Tuttavia, --version non ha eguali.

In generale, non ci sono regole o standard definiti su come dovrebbero essere specificati gli argomenti del programma, solo un mucchio di tradizioni. Tuttavia, se vengono utilizzate le funzioni di analisi della riga di comando getopt e getopt_long, i parametri dovrebbero generalmente seguire lo standard poiché le funzioni della libreria applicano un certo modo di farlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.