Po co używać zbędnego myślnika (-) do przekazywania flag opcji do tar?

35

Aby utworzyć plik tar do katalogu, na tarpolecenie z compress, verbosei fileopcje mogą być wpisane w ten sposób:

$ tar -cvf my.tar my_directory/

Ale działa to również w ten sposób:

 $ tar cvf my.tar my_directory/

Oznacza to, że bez myślnika (-) poprzedzającego opcje. Dlaczego miałbyś kiedykolwiek przesyłać myślnik (-) do listy opcji?

Milktrader
źródło

Odpowiedzi:

43

Istnieje kilka różnych wzorców opcji używanych historycznie w aplikacjach UNIX. Kilka starych, takich jak tar , używa schematu pozycyjnego:

argumenty opcji poleceń

jak na przykład używa tar

tar * coś * f „plik obsługiwany na ścieżkach plików„ * ”do manipulowania„ *

W pierwszej próbie uniknięcia pomyłki, tar i kilka innych programów ze starym stylem flagi-argumenty pozwoliły na rozgraniczenie flag kreskami, ale większość z nas, starzy faceci, po prostu to zignorowało.

Niektóre inne polecenia mają bardziej skomplikowaną składnię wiersza poleceń, na przykład dd (1), która używa flag, znaków równości, nazw ścieżek, argumentów i kuropatwy na drzewie gruszy, wszystkie z dzikim porzuceniem.

W BSD i późniejszych wersjach unixa konwergencja ta była mniej więcej zbieżna z flagami jednoznakowymi oznaczonymi „-”, ale zaczęło to przedstawiać kilka problemów:

  • flagi mogą być trudne do zapamiętania
  • czasami naprawdę chciałeś użyć nazwy z „-”
  • a zwłaszcza w przypadku narzędzi GNU zaczęły obowiązywać ograniczenia wynikające z liczby możliwych flag. Dlatego narzędzia GNU dodały długie opcje GNU, takie jak --output.

Następnie Sun zdecydował, że dodatkowe „-” jest zbędne i zaczął używać flag o długim stylu z pojedynczymi „-s”.

I w ten sposób doszło do bałaganu, jakim jest teraz.

Charlie Martin
źródło
9
„i kuropatwa na gruszy” Lepsze niż moja sucha próba. Wygrałeś.
dmckee
1
ładny kontekst historyczny.
1
Zauważam, że wiele programów X (w tym, powiedzmy X, Xorg), używa flag długiego stylu z jednym -. Czy to ze Słońca?
mattdm
1
Co znaczy „kuropatwa na gruszy”? (Czy mogę
podać
1
@plhn Idiom. Tradycyjna angielska kolęda „Dwanaście dni świąt” wymienia całą masę ekstrawaganckich prezentów, kończącą się „kuropatwą na gruszy”. Sugeruje długą ekstrawagancką listę.
Charlie Martin
8

Możesz podać opcje tar w standardowy sposób uniksowy, tar -c -f foo -v -B file1 file2 file3gdzie potrzebujesz myślnika, aby rozróżnić opcje i parametry lub nazwy plików na końcu wiersza poleceń. Lub możesz umieścić wszystkie opcje razem w pierwszym argumencie, w którym to przypadku myślnik jest opcjonalny.

Następnie jest miejsce ps, w którym używasz myślników, jeśli używasz opcji SysV-ish, i pomiń je, jeśli używasz opcji BSD, tylko po to, aby wszystko było bardziej mylące.

I nawet nie rozmawiajmy o tym find.

Paul Tomblin
źródło
2

Myślnik służy do rozróżnienia między nazwami i wartościami parametrów opcji. Myślę, że to bardziej standardowa konwencja.


źródło
1
Zamierzałem dodać best-practicetag, ponieważ myślałem, że może do tego dojść.
1
@Milktrader, trudne pytanie dotyczy najlepszych praktyk. Przestrzeganie standardowych konwencji jest rzeczywiście najlepszą praktyką, ale nie jest jasne, czy chcesz to zrobić w swoich przypadkach. Będzie to zależeć od twojego scenariusza. Jeśli włamujesz się do szybkiej komendy w powłoce, prawdopodobnie nie przejmowałbyś się tym, ale jeśli piszesz bibliotekę, ważne jest, aby przestrzegać ustalonych konwencji, ponieważ nie masz kontroli nad tym, jak ta biblioteka będzie używana przez klientów. W takim przypadku należy uwzględnić wszystkie możliwe przypadki i ważne jest rozróżnienie między nazwami i wartościami opcji.
-1

Istnieją cztery konwencje korzystania z opcji wiersza poleceń systemu Unix:

  1. -o -p -t (myślnik przed każdą opcją)
  2. -opt (myślnik przed zestawem opcji)
  3. opt (bez myślnika przed zestawem opcji)
  4. --długa opcja (podwójny myślnik przed nazwą opcji)

Na przykład:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz
jonasjacek
źródło
1
Czy ta konwencja dotyczy tylko smoły? Co z ls? ls lrt nie będzie działać, ale ls -lrt / ls -l -r -t będzie działać. Dlaczego tak?
Shashank Vyas,
Cztery konwencje powinny działać dla wszystkich poleceń.
jonasjacek
2
Nie, nie robią tego. Innego dnia próbowałem rm rf <nazwa_pliku>, to też nie działa.
Shashank Vyas
-2

Z wiodącym znakiem minus / myślnik (-) musisz zachować opcje w odpowiedniej kolejności. Bez minus kolejność opcji może się zmienić.

Na przykład:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar
Mohd Golam Hossain
źródło
Ta odpowiedź jest w połowie słuszna, ale AFAIK to tylko takie flagi fbiorą argument, którego kolejność ma znaczenie. Zobacz unix.stackexchange.com/a/239120/3169
Mikel