Perché usare il trattino superflous (-) per passare i flag delle opzioni a tar?


35

Per creare un file tar per una directory, il tarcomando con compress, verbosee filele opzioni possono essere digitati in tal modo:

$ tar -cvf my.tar my_directory/

Ma funziona anche per farlo in questo modo:

 $ tar cvf my.tar my_directory/

Cioè, senza il trattino (-) che precede le opzioni. Perché dovresti mai passare un trattino (-) all'elenco delle opzioni?


Risposte:


43

Esistono diversi modelli per le opzioni che sono state utilizzate storicamente nelle applicazioni UNIX. Diversi vecchi, come il tar , usano uno schema posizionale:

argomenti delle opzioni di comando

come ad esempio usa tar

tar * qualcosa * f "file gestito su" * "percorsi di file da manipolare" *

Nel primo tentativo di evitare la confusione, tar e alcuni altri programmi con il vecchio stile delle bandiere-argomenti hanno permesso di delimitare le bandiere con trattini, ma la maggior parte di noi vecchi semplicemente lo ha ignorato.

Alcuni altri comandi hanno una sintassi della riga di comando più complicata, come dd (1) che utilizza flag, segni di uguaglianza, nomi di percorso, argomenti e una pernice in un albero di pere, tutti con selvaggio abbandono.

In BSD e versioni successive di unix, questo era più o meno convergente in flag a carattere singolo contrassegnati con '-', ma questo ha iniziato a presentare un paio di problemi:

  • le bandiere potrebbero essere difficili da ricordare
  • a volte in realtà volevi usare un nome con '-'
  • e specialmente con gli strumenti GNU, cominciarono ad esserci delle limitazioni imposte dal numero di possibili flag. Quindi gli strumenti GNU hanno aggiunto opzioni GNU lunghe come --output.

Quindi Sun decise che il "-" extra fosse ridondante e iniziò a usare flag di stile lungo con singoli ".

Ed è così che è diventato il casino che è adesso.


9
"e una pernice in un pero" Meglio del mio secco tentativo. Hai vinto.
dmckee,

1
bel contesto storico.

1
Ho notato che molti programmi X (incluso, diciamo, X, di Xorg), usano flag di stile lungo con un singolo -. Viene dal sole?
Mattdm,

1
Qual è il significato di "pernice in un albero di pere"? (Posso avere un link utile e di facile comprensione?)
plhn

1
@plhn Idiom. Un tradizionale canto natalizio inglese "I dodici giorni di Natale" elenca un sacco di regali stravaganti, che terminano con "una pernice in un albero di pere". Suggerisce un lungo elenco stravagante.
Charlie Martin,

8

È possibile fornire opzioni tar nel modo unix standard in tar -c -f foo -v -B file1 file2 file3cui è necessario il trattino per distinguere tra opzioni e parametri o i nomi dei file alla fine della riga di comando. Oppure puoi mettere insieme tutte le opzioni nel primo argomento, nel qual caso il trattino è facoltativo.

Poi c'è ps, dove usi i trattini se stai usando le opzioni SysV-ish e li lasci fuori se stai usando le opzioni BSD-ish, solo per rendere le cose più confuse.

E non parliamo nemmeno find.


2

Il trattino viene utilizzato per chiarire le ambiguità tra i nomi e i valori di un parametro di opzione. Immagino sia più una convenzione standard.


1
Stavo per aggiungere il best-practicetag perché pensavo che potesse dipendere da quello.

1
@Milktrader, è una domanda difficile quando si parla di buone pratiche. Seguire le convenzioni standard è in effetti la migliore pratica, ma non è chiaro se si desidera farlo nei propri casi. Dipenderà dal tuo scenario. Se stai hackerando alcuni comandi rapidi nella shell probabilmente non ti importerebbe molto a riguardo, ma se stai scrivendo una libreria è importante seguire convenzioni consolidate perché non hai il controllo di come questa libreria verrà utilizzata dai clienti. In questo caso dovresti coprire tutti i casi possibili e chiarire le differenze tra nomi e valori delle opzioni è importante.

-1

Esistono fino a quattro convenzioni per utilizzare le opzioni della riga di comando unix:

  1. -o -p -t (trattino prima di ogni opzione)
  2. -opt (trattino prima di una serie di opzioni)
  3. opt (nessun trattino prima di una serie di opzioni)
  4. --long-option (doppio trattino prima del nome di un'opzione)

Per esempio:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz

1
Tale convenzione è applicabile solo al catrame? Che mi dici di ls? Non funzionerà ma ls -lrt / ls -l -r -t funzionerà. Perchè così?
Shashank Vyas,

Le quattro convenzioni dovrebbero funzionare per tutti i comandi.
jonasjacek,

2
No non lo fanno. L'altro giorno ho provato rm rf <nomefile>, anche quello non funziona.
Shashank Vyas,

-2

Con il segno meno / trattino iniziale (-) è necessario mantenere le opzioni in ordine preciso. Senza meno l'ordine della tua opzione può cambiare.

Per esempio:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar

Questa risposta è quasi giusta, ma AFAIK sono solo bandiere del genere fche accettano un argomento il cui ordine conta. Vedi unix.stackexchange.com/a/239120/3169
Mikel
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.