Почему `tar -xvfz` терпит неудачу, но` tar xvfz` работает?


41

tar -xvfz foo.tar.gz возвращает ошибку tar: z: Cannot open: No such file or directory

Это вполне понятно - fкоммутатор ожидает имя файла и поэтому должен быть последним.

Однако tar xvfz foot.tar.gzпропуск дефиса работает, распаковывает и распаковывает файл.

Я проверял это на OS X 10.8 и Ubuntu 12.04.

Есть идеи почему?

[отредактировано, чтобы добавить]

Я всегда использую tar -zxvf foo.tar.gz. Однако этот вопрос возник из-за этого xkcd и моего удивления, когда кто-то настаивал на том, что tar xvfzэто сработает.

введите описание изображения здесь


Ответы:


61

У tar есть 3 типа синтаксиса (согласно этому ):

  • длинные опции (--file)
  • короткие варианты (-f)
  • старые варианты (е)

Для старого синтаксиса опции все буквы должны следовать за «tar» и должны падать в одну группу без пробелов. Порядок букв на самом деле не имеет значения, если аргументы этих букв следуют в том же порядке после набора опций.

Этот старый способ написания опций tar может удивить даже опытных пользователей. Например, две команды:

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

совсем разные. Первый пример использует «archive.tar.gz» в качестве значения параметра «f» и распознает параметр «z». Второй пример, однако, использует «z» в качестве значения для опции «f» - вероятно, не то, что предполагалось.

Старые параметры сохранены для совместимости со старыми версиями tar.

Команда с '-' эквивалентна

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

Вот почему ваш пример работает без "-", а не с "-"


3
wtf unix
BlueRaja
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.