tar cvf czy tar -cvf?

24

Nauczyłem się używać tar bez „-” dla opcji, tar cvfz dir.tar.gz Directory/ale ostatnio natrafiłem na nieco inną tar -czvfskładnię (myślę, że „f” musi być ostatnią opcją w tym przypadku).

Oba działają na systemie Linux i Mac OS. Czy istnieje zalecana składnia z ou bez „-”, która jest bardziej przenośna w różnych wersjach uniksowych?

askobol
źródło
Powodem, dla którego -fmusi być ostatnią opcją jest to, że wymaga ona argumentu i argument ten można podać dotykając opcji. tar -cvfz dir.tar.gz Directoryoznacza utworzenie archiwum o nazwie zzawierającej pliki dir.tar.gzi Directory.
JoL

Odpowiedzi:

27

tarjest jednym z tych starożytnych poleceń z czasów, gdy składnia opcji nie była znormalizowana. Ponieważ wszystkie użyteczne wywołania tarwymagają podania operacji przed podaniem nazwy pliku, większość tarimplementacji interpretuje swój pierwszy argument jako opcję, nawet jeśli nie zaczyna się on od -. Większość obecnych implementacji akceptuje -; Jedyny wyjątek, o którym wiem, to Minix .

Starsze wersje POSIX i Single Unix zawierały tarpolecenie bez -przed specyfikatorem operacji. Single Unix v2 miał zarówno tradycyjne archiwizujące cpioi tar, ale bardzo niewielu flagi mogą być standaryzowane, ponieważ istniejące implementacje były zbyt różne, więc standardy wprowadzono nowe polecenie, pax, który jest jedynym standardem w archiwum od Single Unix v3 . Jeśli chcesz standardowej zgodności, używaj pax, ale uwaga, że ​​wiele dystrybucji Linuksa nie uwzględnia jej w podstawowej instalacji i nie ma jej paxw Minix . Jeśli chcesz mieć przenośność w praktyce, użyj tar cf filename.tar.

Gilles „SO- przestań być zły”
źródło
1
Zauważ też, że jeśli zawiera dystrybucję Linuksa pax, zwykle zawiera najgorszą znaną implementację pax (GNU pax), której należy unikać z powodu wielu błędów.
schily,
Również pskomenda ma taki sam problem, można pominąć -dla opcji.
perror
1
@perror To źle. Wiele wersji psnie pozwala pominąć -. Wersja Linuksa ma opcje zi bez -, ale większość ma inne znaczenie (zgodność BSD vs. System V).
Gilles „SO- przestań być zły”
1
Prawdą jest, że przez większość czasu używam tylko ps aux... Więc mogę się (częściowo) mylić. Przepraszam.
perror
13

Mogę być dinozaurem, ale myślę, że zwykłe używanie „cvf” zamiast „-cvf” jest prawdopodobnie bardziej przenośne. Wyobrażam sobie, że większość dystrybucji Linuksa używa tar GNU, i zgaduję, że * BSD również, ale znajdziesz zastrzeżone Uniksy, które nadal używają starej tar SysV, która wymagała od ciebie, abyś nie używał „-” w opcjach .

Nie używam „-cvf” (lub „-xf” lub cokolwiek innego) i nie mam żadnych problemów nawet z krwawiącym linuksem Arch.

I tak na marginesie, myślę, że możesz użyć standardowych poleceń Sun „jar” z lub bez znaku „-”.

Bruce Ediger
źródło
Zgadzam się z twoją odpowiedzią, nawet jeśli strona informacyjna tar (która jest bardzo jasna na temat trzech stylów określania opcji) mówi, że stare opcje są zachowane tylko dla kompatybilności i istnieje wiele opcji, które NIE mają starej korespondencji.
David Costa
1
Mylisz się: tar w AT&T UNIX został napisany, aby nie mieć - ale akceptuje - i pomija go. Jedynym przenośnym sposobem na wywołanie tar jest wywołanie go bez - a jeśli kiedykolwiek znajdziesz implementację „tar”, która nie akceptuje rzeczy bez - to nie jest tar.
schily
3

W systemie UNIX było niewiele programów, które nie są zgodne z bieżącym standardem opcji.

Jednym jest dd, ale dd pochodzi z programu mainframe IBM DDR(zrzut i przywracanie dysku).

Jeden jest, ara drugi jest tar. Z moich informacji wynika, że ​​tar chciał być podobny do ar.

Wszystkie implementacje tar działają bez - i żadna użyteczna implementacja nie wymaga -. Jeśli więc chcesz pisać przenośne skrypty, sprawdź standard SUSv2 i użyj tylko wiersza poleceń zgodnego z SUSv2.

schily
źródło