Zastanawiam się, czy zapytam o różnicę między tymi dwoma poleceniami (tzn. Tylko kolejność ich opcji jest inna):
tar -zxvf foo.tar.gz
tar -zfxv foo.tar.gz
Pierwszy działał idealnie, ale drugi powiedział:
tar: You must specify one of the `-Acdtrux' or `--test-label' options
Try `tar --help' or `tar --usage' for more information.
I smoła z --test-label
i -zfxv
powiedział:
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
Potem spojrzałem na instrukcję tar i zdałem sobie sprawę, że wszystkie przykłady wykorzystują przełącznik -f
na końcu !!
AFAICT nie ma potrzeby tego ograniczenia, czy jest ?! ponieważ moim zdaniem przełączniki powinny być bezpłatne.
linux
command-line
tar
khikho
źródło
źródło
gtar option parsing
, odkryłeś kolejny powód, dla którego nie używasz gtar.-f
oczekuje, że nazwa pliku będzie następować. W drugiej wersji podałeś-fxv
, co - w przypadku tar - oznacza, że nazwa pliku to „xv”.Odpowiedzi:
Patrząc na komunikat o błędzie, widać, że nie używałeś,
tar
ale raczejgtar
.Zasadniczo może to pomóc zrozumieć:
tar
zwykle zawsze potrzebuje argumentu pliku. Jeśli go brakuje, odczytuje / zapisuje z / do domyślnego rzeczywistego urządzenia taśmowego systemu.star
zmieniłem to w 1982 r., aby domyślnie używać stdin / stdout, a niektóre inne implementacje tar (np. gtar) ostatnio stosowały ten przykład.tar
nie implementuje wiodących-
opcji, które są wywoływanekey letters
w przypadku polecenia tar. Niektóre implementacje dodano później-
jako literę zakazu operacji dla wygody użytkowników, ale nie można na tym polegać.Sposób
tar
analizy jej argumentów (w szczególności argumentu pliku archiwum) jest bardzo ryzykowny. Widziałem wiele archiwów tar, które zniszczyły jeden z plików, które powinny znajdować się w archiwum, ponieważ argument związany z plikiem został przyjęty jako plik archiwum tar.star
z tego powodu (jeśli jest nazywany natywnie jakostar
), nie pozwala na połączenie „f” z innymi opcjami. Jeślistar
zostanie wywołanytar
, implementuje zgodność z wierszem poleceńtar
, ale nadal obsługuje argument dla litery „f” inaczej: argument jest dozwolony tylko wtedy, gdy odnosi się do rzeczywistego pliku urządzenia lub gdy (w trybie zapisu) plik jeszcze nie istnieje .Zalecam unikanie ryzykownego oryginalnego wiersza poleceń tar i raczej używanie nowoczesnej, bezpieczniejszej składni wiersza poleceń
star
.Ze względu na problematyczną składnię wiersza poleceń na początku lat dziewięćdziesiątych
tar
istniały tak zwanetar wars
. W rezultacie programpax
(łacina „pokoju” w wojnach o smołę) został stworzony i ujednolicony.pax
jednak nie zyskał popularności, ponieważ jego składnia jest mniej ryzykowna, ale także mniej intuicyjna niż składnia tar. Innym problemem może byćgpax
to, że jest mniej lub bardziej utrzymany.źródło
star
?tar
icpio
.star
„s-f"$file"
jest również (opróczind
) problem z nazwy plików zaczynające się=
. Więc trzeba go albo napisać-f="$file"
lub-f "$file"
. Nie jestem pewien, czy nazwałbym twoją opcję gwiazdy parsowaniem bezpieczniejszym czy nowoczesnym .-long
długie opcje stylu są niezgodne z-xyz
krótkimi opcjami skróconymi lub-xarg
. Dlatego długie opcje w stylu X11 wymagają, aby krótkie opcje były oddzielne (-x -y
, nie-xy
), a argumenty opcji - na osobnych argumentach (xterm -n foo
, niexterm -nfoo
). I dlatego istnieje dodatkowa kreska w długich opcjach GNU, aby usunąć ewentualne zamieszanie z krótkimi opcjami i dlaczego długie opcje w stylu GNU są lepszym projektem. Możesz-foo
współistnieć-x -y -xy
tylko wtedy, gdy jesteś bardzo ostrożny, aby uniknąć nakładania się.Kolejność przełączników jest dowolna, ale
-f
zawiera obowiązkowy argument, którym jest plik dotar
odczytu / zapisu.Mógłbyś
i to zadziała, a twoje wymagania dotyczące nieokreślonej kolejności przełączników.
W ten sposób działają wszystkie polecenia z opcjami zawierającymi argumenty.
źródło
-f=./myfile
f przyjmuje wartość, nie jest to flaga, lecz dane wejściowe.Tradycyjnie opcje tar są mniej więcej „wolne od zamówień” (kolejność opcji
f
ib
mają znaczenie, jeśli obie są określone). Użycie wiodącego myślnika powoduje jednak, że GNU tar analizuje opcje w sposób uważany za bardziej spójny z innymi poleceniami, przy czym określenie opcji wymagającej argumentu (np. Nazwa pliku dlaf
) natychmiast zajmie resztę słowa, jeśli występuje, jako argument (tradycyjnie, tar używa następnego słowa jako nazwy pliku / bloku, gdy jest określonyf
lubb
). W twoim przypadku nazwa pliku zajęła „xv”.Nie można jednak polegać na tym zachowaniu w zakresie przenośności. Aby zapewnić maksymalną przenośność, należy unikać używania myślnika, zawsze umieszczać na
f
końcu i zawsze umieszczać spację międzyf
nazwą pliku a nią. Jest to jednak uproszczenie, które psuje się, jeśli potrzebujeszb
opcji lub ogólnie dowolna opcja (taka jakC
) inna niżf
ta wymaga argumentu.Jest to udokumentowane w sekcji Podręcznika Tar „Trzy style opcji” . Niektóre inne implementacje (np. FreeBSD) określają opcje starego stylu jako „słowo opcji pakietu”. Oczywiście niektóre implementacje mogą obsługiwać tylko ten typ opcji i mogą ignorować myślnik, jeśli są uwzględnione. Jest to jedyna forma wywołania określona w specyfikacji Single Unix i dlatego gwarantuje działanie na prawie wszystkich systemach.
źródło
C
w BSD lub GNU tar. Schily tar obsługuje go jako -C, ale nie jako C, wszystkie obsługują jako -C).W tar, przełączniki - in były przestarzałe wiele lat temu i nie są już potrzebne. Tar właściwie to mówił, ale już tego nie robi.
źródło