смола та її ключові літери: це помилка чи функція?


18

Мені цікаво запитати різницю цих двох команд (тобто лише порядок їх параметрів різний):

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

Перший пройшов ідеально, але другий сказав:

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

І дьоготь --test-labelі -zfxvсказав:

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

Тоді я переглянув посібник з дьогтю і зрозумів, що в усіх прикладах використовується перемикач -fврешті !!

AFAICT немає необхідності в цьому обмеженні, чи існує ?! тому що, на мій погляд, перемикачі повинні бути безкоштовними.


2
@schily ваша "корекція" в командних рядках затьмарила, яку команду він набрав насправді. Провідний тире змінює поведінку табору GNU для використання іншого аналізатора аргументів. Не використовуючи тире (і, отже, традиційного аналізатора аргументів), друга команда спрацювала б.
Випадково832

Дельта-роздруківка з веб-системи повідомила мені, що ви або хтось раніше додав -, тому я знову його видалив, щоб відповідати тому, що система мені сказала, з ОП. Але якщо ви маєте рацію gtar option parsing, ви виявили ще одну причину невикористання gtar.
schily

1
-fочікує наступного імені файлу. У другій версії ви вказали -fxv, що для tar - означає, що ім'я файлу "xv".
Рольф

1
Обов’язковий XKCD .
Павло

Відповіді:


11

Дивлячись на ваше повідомлення про помилку, очевидно, що ви не скористалися, tarа скоріше gtar.

Загалом це може допомогти зрозуміти:

  • tarЗазвичай завжди потрібен аргумент файлу. Якщо він відсутній, він буде читати / записувати з / на реальний стрічковий пристрій системи за замовчуванням. starзмінив це в 1982 році, щоб використовувати stdin / stdout за замовчуванням, а деякі інші реалізації tar (наприклад, gtar) останнім часом слідували за цим прикладом.

  • tarне реалізує ведучий -для параметрів, які викликаються key lettersу випадку команди tar. Пізніше деякі зручності додано -як неофіційний лист для зручності користувачів, але ви не можете на це покладатися.

  • Спосіб tarаналізу своїх аргументів (зокрема аргумент архівних файлів) є дуже ризикованим. Я бачив багато архівів tar, які знищили один з файлів, який повинен бути в архіві, оскільки аргумент відповідного файлу був прийнятий як файл архіву tar. starз цієї причини (якщо її називають як власне star) не дозволяє "f" об'єднуватися з іншими параметрами. Якщо starйого називають, tarвін реалізує сумісність командного рядка з tar, але все ще обробляє аргумент для букви клавіші "f" інакше: аргумент дозволений лише у тому випадку, якщо він посилається на реальний файл пристрою або коли (у режимі запису) файл ще не існує .

Я рекомендую уникати ризикованого оригінального командного рядка tar та скоріше використовувати сучасний синтаксис безпечнішого командного рядка, з яким ви отримуєте star.

Через проблематичний синтаксис командного рядка на початку 1990-х рр. Виникли tarтак звані tar wars. В результаті paxбуло створено та стандартизовано програму (лат. «Мир» у дьогтьових війнах). paxоднак він не набув популярності, оскільки його синтаксис є менш ризикованим, але також менш інтуїтивним, ніж синтаксис смоли. Ще одна проблема може полягати в тому, що вона gpaxє більш-менш недотриманою.


3
Деграновані війни закінчилися. виграв пістолет.
Джошуа

2
Якщо ви мали рацію, то чому всі програми tar-копії копіюють функції star?
шилі

1
До речі: війни з дьогтем були битвою між tarта cpio.
schily

2
Гаразд, тому, здається star, -f"$file"це також (на додаток до ind) проблема з іменами файлів, починаючи з =. Тож треба написати це -f="$file"або -f "$file". Я не впевнений, я б назвав ваш зірковий варіант розбору більш безпечним чи сучасним .
Стефан Шазелас

3
-longДовгі параметри стилів несумісні зі -xyzстислими короткими параметрами або -xarg. Ось чому довгі параметри стилю X11 вимагають, щоб короткі параметри були окремими ( -x -y, не -xy), а аргументи параметрів були окремими аргументами ( xterm -n foo, не xterm -nfoo). І тому в довгих варіантах GNU є додатковий тире, щоб усунути можливі плутанини з короткими параметрами, і чому довгі варіанти в стилі GNU є кращим дизайном. Ви можете -fooспівіснувати -x -y -xyлише тоді, якщо ви дуже обережні, щоб уникнути перекриттів.
Стефан Шазелас

55

Порядок комутаторів безкоштовний, але -fмає обов'язковий аргумент, який є файлом, який tarбуде читати / записувати.

Ви могли б зробити

tar -zf foo.tar.gz -xv

і це спрацює, і є ваша вимога неспецифічного порядку комутаторів.

Так працюють усі команди, у яких є параметри з аргументами.


5
Tar не працює, як і інші команди, оскільки використовує інший значно старший аналізатор командного рядка - той самий, який використовується в команді "ar" та старій команді (pre-POSIX) "ps".
schily

1
Дякую за це, обрана відповідь, хоча й ретельна, не дуже дозволила мені зрозуміти, в чому конкретно проблема. Зрештою, очевидно, що з повідомлення про помилку вказується, що tar намагався прочитати файл "xv"
Джош Румбут,

1
Я вважаю, ви також можете оголосити це як -f=./myfile, тобто f приймає значення, це не прапор, а його вхід.
ThorSummoner

14

Традиційно опції смоли є більш-менш "без замовлення" (порядок fі bпараметри мають значення, якщо вказано обидва). Однак, використовуючи провідний тире, змушує GNU tar розбирати параметри таким чином, які вважаються більш узгодженими з іншими командами, де вказівка ​​параметра, для якого потрібен аргумент (наприклад, ім'я файлу для f), негайно споживає решту "слова", якщо такий є, як аргумент (традиційно, tar використовує наступне слово як ім'я файлу / розміру блоку, коли fабо bвказано). У вашому випадку як ім'я файлу знадобилося "xv".

Однак ця поведінка не може покладатися на портативність. Для максимальної портативності вам слід уникати використання тире, завжди ставити fостаннє та завжди ставити пробіл між fіменем файлу. Це, однак, спрощення, яке виходить з ладу, якщо вам потрібен bваріант або взагалі будь-який варіант (наприклад C), крім того, fщо вимагає аргументу.

Це задокументовано в розділі Посібника з Тар "Три стилі варіантів" . Деякі інші реалізації (наприклад, FreeBSD) посилаються на старі параметри стилю як "слово в комплекті". І звичайно, деякі реалізації можуть підтримувати лише цей тип параметрів, а можуть ігнорувати тире, якщо вони включені. Це єдина форма виклику, визначена в специфікації Single Unix, і тому гарантована робота майже в усіх системах.


2
Зауважте, що деякі реалізації підтримують інші параметри з аргументами (наприклад, Cу BSD або GNU tar. Schily tar підтримує його як -C, але не як C, всі підтримують його як -C).
Стефан Шазелас

0

У дьогтю, то - в комутаторах не застаріла багато років тому , і більше немає необхідності. Тарь насправді казав вам, але більше не робить.

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

Both of these work fine without the -.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.