Warum schlägt `tar -xvfz` fehl, aber` tar xvfz` funktioniert?

41

tar -xvfz foo.tar.gz gibt einen Fehler zurück tar: z: Cannot open: No such file or directory

Dies ist völlig verständlich - der fSwitch erwartet einen Dateinamen und muss daher der letzte sein.

tar xvfz foot.tar.gzWenn Sie jedoch den Bindestrich weglassen, wird die Datei dekomprimiert und dekomprimiert.

Ich habe dies unter OS X 10.8 und Ubuntu 12.04 getestet.

Irgendwelche Ideen warum?

[bearbeitet zum hinzufügen]

Ich benutze immer tar -zxvf foo.tar.gz. Diese Frage ist jedoch aufgrund dieser xkcd entstanden , und meine Überraschung, als jemand darauf bestand, dass tar xvfzdies funktionieren würde.

Bildbeschreibung hier eingeben

anu
quelle
12
Also sorry: xkcd.com/1168
MichaelHouse

Antworten:

61

tar hat 3 Arten von Syntax (gemäß diesem ):

  • lange Optionen (--file)
  • kurze Optionen (-f)
  • alte Optionen (f)

Bei der alten Optionssyntax müssen alle Buchstaben "tar" folgen und müssen alle in eine einzelne Gruppe ohne Leerzeichen fallen. Die Reihenfolge der Buchstaben spielt keine Rolle, solange die Argumente zu diesen Buchstaben nach der Auswahl der Optionen in derselben Reihenfolge stehen.

Diese alte Art des Schreibens von Teeroptionen kann selbst erfahrene Benutzer überraschen. Zum Beispiel die beiden Befehle:

 # tar cfz archive.tar.gz file
 # tar -cfz archive.tar.gz file

sind ganz anders. Das erste Beispiel verwendet 'archive.tar.gz' als Wert für die Option 'f' und erkennt die Option 'z'. Das zweite Beispiel verwendet jedoch 'z' als Wert für die Option 'f' - wahrscheinlich nicht das, was beabsichtigt war.

Alte Optionen werden beibehalten, um die Kompatibilität mit alten Versionen von tar zu gewährleisten.

Der Befehl mit einem '-' entspricht

tar -czf archive.tar.gz file
tar -cf archive.tar.gz -z file
tar cf archive.tar.gz -z file

Das ist der Grund, warum Ihr Beispiel ohne "-" und nicht mit "-" arbeitet.

GeekRide
quelle
3
wtf unix
BlueRaja