Dlaczego `tar -xvfz` kończy się niepowodzeniem, ale` tar xvfz` działa?

41

tar -xvfz foo.tar.gz zwraca błąd tar: z: Cannot open: No such file or directory

Jest to całkowicie zrozumiałe - fprzełącznik oczekuje nazwy pliku, więc musi być ostatni.

Jednak pominięcie łącznika tar xvfz foot.tar.gzdziała, dekompresuje i rozpakowuje plik.

Przetestowałem to na OS X 10.8 i Ubuntu 12.04.

Jakieś pomysły, dlaczego?

[edytowane, aby dodać]

Zawsze używam tar -zxvf foo.tar.gz. Jednak to pytanie powstało z powodu tego xkcd i moje zdziwienie, gdy ktoś nalegał, aby tar xvfzto zadziałało.

wprowadź opis zdjęcia tutaj

anu
źródło
12
Przykro mi: xkcd.com/1168
MichaelHouse

Odpowiedzi:

61

tar ma 3 typy składni (zgodnie z tym ):

  • długie opcje (- plik)
  • krótkie opcje (-f)
  • stare opcje (f)

W przypadku starej składni opcji wszystkie litery muszą występować po „tar” i wszystkie muszą należeć do jednej grupy bez spacji. Kolejność liter tak naprawdę nie ma znaczenia, o ile argumenty do tych liter mają tę samą kolejność po zbiorze opcji.

Ten stary sposób pisania opcji tar może zaskoczyć nawet doświadczonych użytkowników. Na przykład dwa polecenia:

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

są zupełnie inne. Pierwszy przykład wykorzystuje „archive.tar.gz” jako wartość dla opcji „f” i rozpoznaje opcję „z”. Drugi przykład wykorzystuje jednak „z” jako wartość dla opcji „f” - prawdopodobnie nie to, co było zamierzone.

Zachowane są stare opcje dla kompatybilności ze starszymi wersjami tar.

Polecenie z „-” jest równoważne z

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

To jest powód, dla którego twój przykład działa bez „-”, a nie z „-”

GeekRide
źródło
3
wtf unix
BlueRaja