Чому `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це спрацює.

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


12
Так вибачте: xkcd.com/1168
MichaelHouse

Відповіді:


61

tar має 3 типи синтаксису (відповідно до цього ):

  • довгі параметри (--file)
  • короткі варіанти (-f)
  • старі варіанти (f)

Для синтаксису старого варіанту всі літери повинні відповідати "дьогтю" і всі вони повинні потрапляти в одну групу без пробілів. Порядок листів насправді не має значення, доки аргументи цих листів слідують за тим самим порядком після збору варіантів.

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

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

зовсім інші. Перший приклад використовує 'archive.tar.gz' як значення для параметра 'f' і розпізнає варіант 'z'. Однак другий приклад використовує "z" як значення для параметра "f" - можливо, не те, що було призначено.

Старі параметри зберігаються для сумісності зі старими версіями смоли.

Команда з "-" еквівалентна

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.