tar e le sue lettere chiave: è un bug o una funzionalità?


18

Mi chiedo di chiedere la differenza di questi due comandi (cioè solo l'ordine delle loro opzioni è diverso):

  1. tar -zxvf foo.tar.gz
  2. tar -zfxv foo.tar.gz

Il primo funzionava perfettamente, ma il secondo diceva:

tar: You must specify one of the `-Acdtrux' or `--test-label'  options
Try `tar --help' or `tar --usage' for more information.

E tar con --test-labele ha -zfxvdetto:

tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

Poi ho guardato il manuale di tar e ho capito che alla fine tutti gli esempi usano switch -f!!

AFAICT non c'è bisogno di questa limitazione, o no ?! perché a mio avviso gli switch dovrebbero essere gratuiti.


2
@schily la tua "correzione" alle righe di comando ha oscurato quale comando ha effettivamente digitato. Un trattino iniziale modifica il comportamento di Tar GNU in modo da utilizzare un diverso parser di argomenti. Usando nessun trattino (e quindi il tradizionale parser di argomenti), il secondo comando avrebbe funzionato.
Casuale 832

La stampa delta dal sistema web mi ha detto che tu o qualcuno prima hai aggiunto il -, quindi l'ho rimosso di nuovo per abbinare ciò che il sistema mi ha detto era dall'OP. Ma se hai ragione gtar option parsing, hai scoperto un altro motivo per non usare gtar.
schily,

1
-fsi aspetta che segua il nome del file. Nella tua seconda versione, hai specificato -fxvche, per tar, significa che il nome del file è "xv".
Rolf,

1
XKCD obbligatorio .
Pavel,

Risposte:


11

Guardando il tuo messaggio di errore, è ovvio che non hai usato tarma piuttosto gtar.

In generale questo può aiutare a capire le cose:

  • tarnormalmente ha sempre bisogno di un argomento di file. Se manca, leggerà / scriverà da / sul dispositivo a nastro reale predefinito del sistema. starcambiato questo nel 1982 per usare stdin / stdout di default e alcune altre implementazioni tar (es. gtar) hanno seguito questo esempio di recente.

  • tarnon implementa le -opzioni iniziali per le chiamate chiamate key lettersnel caso del comando tar. Alcune implementazioni successivamente sono state aggiunte -come lettera chiave non operativa per comodità degli utenti, ma non è possibile fare affidamento su questo.

  • Il modo in cui taranalizza i suoi argomenti (in particolare l'argomento del file di archivio) è altamente rischioso. Ho visto molti archivi tar che hanno distrutto uno dei file che dovrebbero essere nell'archivio perché l'argomento relativo al file è stato preso come file di archivio tar. starper questo motivo (se chiamato nativamente come star) non consente di concatenare "f" con altre opzioni. Se starviene chiamato tarimplementa la compatibilità con la riga di comando tar, ma gestisce comunque l'argomento per la lettera "f" in modo diverso: l'argomento è consentito solo se si riferisce a un file dispositivo reale o quando (in modalità di scrittura) il file non esiste ancora .

Consiglio di evitare la rischiosa riga di comando tar originale e piuttosto di utilizzare la moderna sintassi della riga di comando più sicura che si ottiene star.

A causa della problematica sintassi della riga di comando tar, c'erano i cosiddetti tar warsnei primi anni '90. Di conseguenza, il programma pax(in latino "pace" nelle guerre di catrame) è stato creato e standardizzato. paxtuttavia non ha guadagnato popolarità in quanto la sua sintassi è meno rischiosa ma anche meno intuitiva della sintassi tar. Un altro problema può essere che gpaxè più o meno non mantenuto.


3
Le guerre di catrame sono finite. vinse Guntar.
Giosuè,

2
Se avevi ragione, perché tutte le implementazioni tar copiano le funzionalità star?
schily,

1
A proposito: le guerre di catrame sono state una battaglia tra tare cpio.
schily,

2
OK, così sembra star's -f"$file"è anche (in aggiunta a ind) un problema con i nomi di file che iniziano con =. Quindi bisogna scriverlo -f="$file"o -f "$file". Non sono sicuro che chiamerei la tua opzione stella analizzando più sicuro o moderno .
Stéphane Chazelas,

3
-longle opzioni lunghe di stile sono incompatibili con le -xyzopzioni brevi condensate o -xarg. Ecco perché le opzioni lunghe in stile X11 richiedono che le opzioni brevi siano separate ( -x -y, non -xy) e gli argomenti delle opzioni su argomenti separati ( xterm -n foo, non xterm -nfoo). Ed è per questo che c'è un trattino extra nelle opzioni lunghe GNU, per rimuovere la possibile confusione con opzioni brevi e perché le opzioni lunghe in stile GNU sono un design migliore. Puoi -fooconvivere -x -y -xysolo se stai molto attento a evitare le sovrapposizioni.
Stéphane Chazelas,

55

L'ordine degli switch è gratuito, ma -fha un argomento obbligatorio che è il file che tarleggerà / scriverà.

Si potrebbe fare

tar -zf foo.tar.gz -xv

e funzionerà e avrà il tuo requisito di un ordine non specifico di switch.

Ecco come funzionano tutti i comandi che hanno opzioni con argomenti.


5
Tar non funziona come gli altri comandi poiché utilizza un parser della riga di comando molto più vecchio, lo stesso utilizzato nel comando "ar" e nel vecchio comando "ps" (pre-POSIX).
schily,

1
Grazie per questo, la risposta selezionata, sebbene approfondita, non mi ha permesso di vedere quale fosse il problema. In retrospettiva, sembra ovvio dal messaggio di errore che indica che tar stava cercando di leggere il file "xv"
Josh Rumbut,

1
Credo che puoi anche dichiararlo come -f=./myfile, vale a dire, f prende un valore, non è una bandiera, è un input.
ThorSummoner,

14

Tradizionalmente, le opzioni di tar sono più o meno "prive di ordine" (l'ordine delle opzioni fe è bimportante se sono specificate entrambe). L'uso di un trattino iniziale, tuttavia, fa sì che GNU tar analizzi le opzioni in un modo considerato più coerente con altri comandi, dove la specifica di un'opzione che richiede un argomento (come il nome del file per f) consumerà immediatamente il resto della "parola", se presente, come argomento (tradizionalmente, tar utilizza la parola successiva come dimensione del file / blocco quando viene specificato fo b). Nel tuo caso, ha preso "xv" come nome del file.

Tuttavia, questo comportamento non può essere invocato per la portabilità. Per la massima portabilità, dovresti evitare di usare un trattino, mettere sempre l' fultimo e mettere sempre uno spazio tra fe il nome del file. Questa è, tuttavia, una semplificazione che si interrompe se hai bisogno bdell'opzione o in generale qualsiasi opzione (come C) diversa da fquella richiede un argomento.

Questo è documentato nella sezione Manuale Tar "I tre stili di opzione" . Alcune altre implementazioni (ad es. FreeBSD) fanno riferimento alle vecchie opzioni di stile come "parola di opzione in bundle". E, naturalmente, alcune implementazioni possono supportare solo questo tipo di opzione e possono o meno ignorare un trattino se incluso. Questa è l'unica forma di invocazione specificata nella specifica Unix singola e quindi garantita per funzionare su quasi tutti i sistemi.


2
Si noti che alcune implementazioni supportano altre opzioni con argomenti (come Cin tar BSD o GNU. Schily tar lo supporta come -C ma non come C, tutti lo supportano come -C).
Stéphane Chazelas,

0

In tar, il - in switch è stato deprecato molti anni fa e non è più necessario. Tar effettivamente lo diceva, ma non lo fa più.

ie:
tar zxvf foo.tar.gz
tar zfxv foo.tar.gz

Both of these work fine without the -.
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.