tar cvf или tar -cvf?

24

Я научился использовать tar без '-' для опций, например, tar cvfz dir.tar.gz Directory/но недавно я столкнулся с немного другим tar -czvfсинтаксисом (я думаю, что 'f' должно быть последним вариантом в этом случае).

Оба работают на Linux и Mac OS. Есть ли рекомендуемый синтаксис с ou без '-', который является более переносимым по сравнению с Unix?

ascobol
источник
1
Смотрите также: unix.stackexchange.com/questions/13573/...
ОООНР
Причина, по которой -fэтот параметр должен быть последним, заключается в том, что он принимает аргумент, и этот аргумент может быть задан касанием этого параметра. tar -cvfz dir.tar.gz Directoryозначает создать архив с именем, zкоторый содержит файлы dir.tar.gzи Directory.
JoL

Ответы:

27

tarэто одна из тех древних команд со времен, когда синтаксис опций не был стандартизирован. Поскольку все полезные вызовы tarтребуют указания операции перед предоставлением какого-либо имени файла, большинство tarреализаций интерпретируют свой первый аргумент как параметр, даже если он не начинается с -. Большинство текущих реализаций принимают a -; единственное исключение, о котором я знаю, это Minix .

Более ранние версии POSIX и Single Unix включали tarкоманду без -спецификатора операции перед. Single Unix v2 были как традиционные архиваторы cpioи tar, но очень немногие флаги могут быть стандартизированы , потому что существующие реализации были слишком различны, поэтому стандарты ввели новую команду, pax, которая является единственным стандартом архиватора в так Single Unix v3 . Если вам нужно стандартное соответствие, используйте pax, но имейте в виду, что многие дистрибутивы Linux не включают его в базовую установку, а paxв Minix его нет . Если вы хотите мобильности на практике, используйте tar cf filename.tar.

Жиль "ТАК - перестань быть злым"
источник
1
Также обратите внимание, что если дистрибутив Linux содержит дистрибутив pax, он обычно поставляется с худшей из известных реализаций pax (GNU pax), которых следует избегать из-за множества ошибок.
Щили
Кроме того, psкоманда имеет такое же поведение, вы можете опустить -для параметров.
perror
1
@perror Это неправильно. Многие версии psне позволяют вам опустить -. Версия для Linux имеет опции с и без -, но большинство из них имеют разные значения (совместимость BSD против System V).
Жиль "ТАК ... перестать быть злым"
1
Это правда, что большую часть времени я использую только ps aux... Таким образом, я могу (частично) ошибаться. Сожалею.
perror
13

Я могу быть динозавром, но я думаю, что привычное использование «cvf» вместо «-cvf», вероятно, более переносимо. Я полагаю, что большинство дистрибутивов Linux используют GNU tar, и я предполагаю, что * BSD также делают, но вы найдете проприетарные Unix, которые по-прежнему используют старый SysV tar, который раньше требовал от вас не использовать '-' в опциях ,

Я не использую "-cvf" (или "-xf" или что-то еще), и у меня нет проблем даже с передовой версией Arch linux.

И, как примечание, я думаю, что вы можете использовать стандартные параметры команды jar для Sun с или без знака «-».

Брюс Эдигер
источник
Я согласен с вашим ответом, даже если информационная страница tar (которая очень четко описывает три стиля задания опций) говорит о том, что старые опции сохраняются только для совместимости, и существует множество опций, которые НЕТ старого соответствия.
Дэвид Коста
1
Вы не правы: tar в AT & T UNIX был написан так, чтобы не иметь - но он принимает - и пропускает его. Единственный переносимый способ вызвать tar - это вызывать его без - и если вы когда-нибудь найдете реализацию «tar», которая не принимает вещи без - это не tar.
Шили
3

В UNIX было немного программ, которые не соответствуют текущему стандарту опций.

Один из них dd, но dd был получен из программы мэйнфрейма IBM DDR(Disk Dump and Restore).

Один есть, arа другой есть tar. По моей информации, tar хотел быть похожим на ar.

Все реализации tar работают без - и ни одна полезная реализация не требует -. Поэтому, если вам нравится писать переносимые сценарии, проверьте стандарт SUSv2 и используйте только командную строку, совместимую с SUSv2.

Шили
источник