tar i jego kluczowe litery: czy to błąd, czy funkcja?

18

Zastanawiam się, czy zapytam o różnicę między tymi dwoma poleceniami (tzn. Tylko kolejność ich opcji jest inna):

  1. tar -zxvf foo.tar.gz
  2. 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-labeli -zfxvpowiedział:

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 -fna końcu !!

AFAICT nie ma potrzeby tego ograniczenia, czy jest ?! ponieważ moim zdaniem przełączniki powinny być bezpłatne.

khikho
źródło
2
@schily twoja „korekta” wiersza poleceń przesłaniała to, co faktycznie wpisał. Wiodący myślnik zmienia zachowanie GNU tar na inny parser argumentów. Bez użycia myślnika (a więc tradycyjnego parsera argumentów) drugie polecenie zadziałałoby.
Random832
Wydruk delta z systemu internetowego powiedział mi, że ty lub ktoś przed dodaniem -, więc usunąłem go ponownie, aby pasował do tego, co system powiedział mi z PO. Ale jeśli masz rację gtar option parsing, odkryłeś kolejny powód, dla którego nie używasz gtar.
schily
1
-foczekuje, że nazwa pliku będzie następować. W drugiej wersji podałeś -fxv, co - w przypadku tar - oznacza, że ​​nazwa pliku to „xv”.
Rolf
1
Obowiązkowe XKCD .
Pavel

Odpowiedzi:

11

Patrząc na komunikat o błędzie, widać, że nie używałeś, tarale raczej gtar.

Zasadniczo może to pomóc zrozumieć:

  • tarzwykle zawsze potrzebuje argumentu pliku. Jeśli go brakuje, odczytuje / zapisuje z / do domyślnego rzeczywistego urządzenia taśmowego systemu. starzmienił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.

  • tarnie implementuje wiodących -opcji, które są wywoływane key lettersw 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 taranalizy 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. starz tego powodu (jeśli jest nazywany natywnie jako star), nie pozwala na połączenie „f” z innymi opcjami. Jeśli starzostanie wywołany tar, 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 taristniały tak zwane tar wars. W rezultacie program pax(łacina „pokoju” w wojnach o smołę) został stworzony i ujednolicony. paxjednak 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ć gpaxto, że jest mniej lub bardziej utrzymany.

schily
źródło
3
Wojny smołowe się skończyły. Guntar wygrał.
Jozuego
2
Jeśli miałeś rację, dlaczego wszystkie implementacje tar kopiują funkcje star?
schily
1
BTW: wojny smołowe były bitwą pomiędzy tari cpio.
schily
2
OK, więc wydaje star„s -f"$file"jest również (oprócz ind) 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 .
Stéphane Chazelas
3
-longdługie opcje stylu są niezgodne z -xyzkró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, nie xterm -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 -foowspółistnieć -x -y -xytylko wtedy, gdy jesteś bardzo ostrożny, aby uniknąć nakładania się.
Stéphane Chazelas,
55

Kolejność przełączników jest dowolna, ale -fzawiera obowiązkowy argument, którym jest plik do tarodczytu / zapisu.

Mógłbyś

tar -zf foo.tar.gz -xv

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.

wurtel
źródło
5
Tar nie działa jak inne polecenia, ponieważ używa innego, znacznie starszego parsera wiersza poleceń - tego samego, który jest używany w poleceniu „ar” i starym (psim przed POSIX).
schily
1
Dziękuję za to, wybrana odpowiedź, choć dokładna, tak naprawdę nie pozwoliła mi zobaczyć, na czym dokładnie polega problem. Z perspektywy czasu wydaje się oczywiste, że komunikat o błędzie mówi, że tar próbował odczytać plik „xv”
Josh Rumbut
1
Wierzę, że można to również zadeklarować, ponieważ -f=./myfilef przyjmuje wartość, nie jest to flaga, lecz dane wejściowe.
ThorSummoner,
14

Tradycyjnie opcje tar mniej więcej „wolne od zamówień” (kolejność opcji fi bmają 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 dla f) 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ślony flub b). 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 fkońcu i zawsze umieszczać spację między fnazwą pliku a nią. Jest to jednak uproszczenie, które psuje się, jeśli potrzebujesz bopcji lub ogólnie dowolna opcja (taka jak C) inna niż fta 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.

Losowo 832
źródło
2
Zauważ, że niektóre implementacje obsługują inne opcje z argumentami (jak Cw BSD lub GNU tar. Schily tar obsługuje go jako -C, ale nie jako C, wszystkie obsługują jako -C).
Stéphane Chazelas
0

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.

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

Both of these work fine without the -.
Paweł
źródło