Мне интересно спросить разницу между этими двумя командами (т. Е. Отличаются только порядок их параметров):
tar -zxvf foo.tar.gz
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
Затем я посмотрел руководство по tar и понял, что все примеры с использованием switch -f
в конце !!
AFAICT нет необходимости в этом ограничении, или есть ?! потому что, на мой взгляд, переключатели должны быть бесплатными.
linux
command-line
tar
khikho
источник
источник
gtar option parsing
, вы обнаружили другую причину не использовать gtar.-f
ожидает, что имя файла будет следовать. Во второй версии вы указали-fxv
, что - для tar - означает, что имя файла - «xv».Ответы:
Глядя на ваше сообщение об ошибке, очевидно, что вы не использовали,
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
.Из-за проблемного синтаксиса командной строки
tar
, так называемые былиtar wars
в начале 1990-х. В результатеpax
была создана и стандартизирована программа (в переводе с латинского «мир» в тар-войнах).pax
однако не получил популярности, поскольку его синтаксис менее рискован, но и менее интуитивен, чем синтаксис tar. Другая проблема может быть в том, чтоgpax
она более или менее не поддерживается.источник
star
?tar
иcpio
.star
что-f"$file"
это (в дополнение кind
) проблема с именами файлов, начинающимися с=
. Поэтому нужно писать либо-f="$file"
или-f "$file"
. Я не уверен, что назвал бы ваш звездный вариант более безопасным или современным .-long
длинные варианты стиля несовместимы с сокращенными-xyz
короткими или-xarg
. Вот почему длинные параметры в стиле X11 требуют, чтобы короткие параметры были отдельными (-x -y
не-xy
), а аргументы параметров - отдельными (xterm -n foo
неxterm -nfoo
). И именно поэтому в длинных опциях GNU есть дополнительная черта, чтобы устранить возможную путаницу с короткими опциями, и почему длинные опции в стиле GNU являются лучшим дизайном. Вы можете-foo
сосуществовать,-x -y -xy
только если вы очень осторожны, чтобы избежать совпадений.Порядок ключей свободен, но
-f
имеет обязательный аргумент - файлtar
для чтения / записи.Вы могли бы сделать
и это сработает, и у вас есть требование не определенного порядка коммутаторов.
Так работают все команды с опциями, имеющими аргументы.
источник
-f=./myfile
, то есть, f принимает значение, это не флаг, а вход.Традиционно параметры Тар являются более или менее «порядком свободного» (порядок из
f
иb
вариантов имеют значения , если указаны оба). Однако использование начального дефиса заставляет GNU tar анализировать параметры таким образом, который считается более совместимым с другими командами, где указание параметра, для которого требуется аргумент (например, имя файла дляf
), немедленно потребляет остальную часть слова. если есть, в качестве аргумента (традиционно tar использует следующее слово в качестве имени файла / размера блока, когдаf
илиb
указано). В вашем случае, это взяло "xv" в качестве имени файла.Однако на такое поведение нельзя полагаться в отношении переносимости. Для максимальной переносимости вам следует избегать использования тире, всегда ставить
f
последнюю и всегда ставить пробел междуf
именем файла. Это, однако, упрощение, которое нарушается, если вам нуженb
параметр или вообще любой параметр (такой какC
), кромеf
этого, требует аргумента.Это описано в разделе «Три стиля» в руководстве пользователя Tar . Некоторые другие реализации (например, FreeBSD) ссылаются на опции старого стиля как «связанное слово опции». И, конечно, некоторые реализации могут поддерживать только этот тип параметров и могут или не могут игнорировать дефис, если он включен. Это единственная форма вызова, указанная в спецификации Single Unix и, следовательно, гарантированно работающая практически на всех системах.
источник
C
в BSD или GNU tar. Schily tar поддерживает его как -C, но не как C, все поддерживают его как -C).В tar переключатели « - in» устарели много лет назад и больше не нужны. Тар на самом деле раньше говорил вам, но больше не говорит.
источник