Qual è la differenza tra i flag single dash e double dash sui comandi shell?


70

Sono nuovo a lavorare nella shell e l'uso di questi comandi sembra arbitrario. C'è un motivo per cui una bandiera ha un trattino singolo e un'altra potrebbe avere un trattino doppio?


Dovrebbe essere governato dallo standard POSIX: iam.ubc.ca/guides/javatut99/essential/attributes/_posix.html
cjc

Quel link ora è 404 @cjc :( Un link forse più affidabile potrebbe essere en.wikipedia.org/wiki/POSIX
Bernhard Hofmann

Collegamento migliore: en.wikipedia.org/wiki/…
Craig Fisher

Risposte:


110

Un singolo trattino può essere seguito da più flag a carattere singolo. Un doppio trattino indica una singola opzione multi-carattere.

Considera questo esempio:

tar -czf

In questo esempio, -czfspecifica tre bandiere di un solo carattere: c, z, e f.

Ora considera un altro esempio:

tar --exclude

In questo caso, --excludespecifica una singola opzione multicharacter denominata exclude. Il doppio trattino disambigua l'argomento della riga di comando, assicurando che tarinterpreta come excludepiuttosto che una combinazione di e, x, c, l, u, d, e e.


1
@kylex, no, poiché non esiste un'opzione lunga denominata solo "c" e - indica un'opzione lunga, non segue un'opzione a carattere singolo.
psusi,

13
A volte anche i comandi lunghi possono essere tratteggiati in modo singolo. Ad esempio 'cdrecord' usa tutti i comandi a trattino singolo (-eject -dao ...). Dipende tutto dal programma, ma la maggior parte (!) Di essi usa - per comandi singoli e - per più caratteri (lunghi)
mulaz,

8
@mulaz, sì, cdrecord fa parecchie cose sciocche.
psusi,

10
anche tenere a mente - usato da solo di solito significa la fine delle opzioni. vedi qui per maggiori informazioni: unix.stackexchange.com/questions/11376/…
Sirex,

3
@killjoy, perché, indipendentemente dall'ignoranza o dalla scelta, gli autori di quei programmi non hanno seguito ovviamente la convenzione. Proprio come cdrecordmenzionato anni fa nei commenti sopra.
psusi,

17

Tutto dipende dal programma. Di solito "-" è usato per le opzioni "brevi" (una lettera, -h) e "-" per le opzioni "lunghe" (er) (--help).

Le opzioni brevi di solito possono essere combinate (quindi "-h -a" è uguale a "-ha")

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 caratteri trattino-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.

fonte


2
Allora perché è java -version e ant -version, allora?
uccidi il

7

È davvero una convention. Tuttavia, può aiutare i parser a conoscere in modo più efficiente le opzioni passate al programma. Inoltre, ci sono utilità ordinate che possono aiutare ad analizzare questi comandi, come getopt(3)o non standard getopt_long(3)per analizzare gli argomenti di un programma.

È bello, perché possiamo avere più opzioni brevi combinate, come dicono altre risposte, come tar -xzf myfile.tar.gz.

Se ci fosse un argomento "Lisa" per ls, probabilmente avrebbe un significato diverso da digitare ls -lisarispetto a ls --lisa. I primi sono i l, i, s, e adei parametri, non la parola.

In effetti, potresti scrivere ls -l -i -s -a, intendendo esattamente lo stesso di ls -lisa, ma ciò dipenderebbe dal programma.

Ci sono anche programmi che non obbediscono a questa convenzione. Soprattutto per la mia vista, dde gcc.


3

opzioni brevi con trattino singolo vs opzioni lunghe con trattino doppio

le opzioni brevi possono essere combinate in un singolo argomento;

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

Se consentiamo opzioni lunghe con trattino singolo, si crea ambiguità. Per risolvere questo, usiamo il doppio trattino per le opzioni lunghe.

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.