Gdzieś widziałem rant przeciwko java / javac rzekomo przy użyciu mieszanki stylów Windows i Unix
java -classpath ... -ea ... Something
IMHO, to nie jest miks, to po prostu find
działa, prawda? AFAIK, zgodnie z POSIX, składnia powinna być podobna
java --classpath ... --ea ... Something
i -abcdef
oznaczałoby określenie 6 krótkich opcji jednocześnie. Zastanawiam się, która wersja ogólnie prowadzi do mniejszego pisania i mniej błędów.
Piszę małe narzędzie w Javie i w żadnym wypadku nie będę używać stylu Windows, /a /b
ponieważ interesuje mnie przede wszystkim Unix. Jaki styl powinienem wybrać?
java
unix
command-line
maaartinus
źródło
źródło
Odpowiedzi:
Konwencje argumentów POSIX można znaleźć w rozdziale Konwencje narzędzi . Styl POSIX składa się z opcji z pojedynczym myślnikiem, po którym następuje pojedyncza litera oznaczająca opcję, z wartością argumentu oddzieloną od opcji spacją.
Istnieją wyjątki od reguł -
find
na przykład - ale są one spowodowane historycznymi precedensami uniksowymi.X Windows (X11) używa
find
opcji długich nazw podobnych do pojedynczego myślnika.Opcje długiej nazwy z podwójnym myślnikiem zostały zapoczątkowane przez GNU (po objeździe
+
jako prefiksu).Zobacz to pytanie StackOverflow w celu omówienia szerokiej gamy znanych systemów obsługi argumentów wiersza poleceń - jest ich wiele. ( Ponieważ to było napisane, władzą, decyduje pytanie SO 367309 nie był dobrym rozwiązaniem dla tak. Mam przeniesiona odpowiedź na inne pytanie, co jest ogólna składnia polecenia Unix shell? . )
Możesz rozszerzyć listę technik, aby objąć
git
(i wiele innych systemów), w których otrzymujesz strukturę taką jak:basecommand
[ opcje globalne ]subcommand
[ opcje podrzędnych poleceń ] [nazwa ...]Może istnieć wiele komend podrzędnych, z których każda ma własny słownik opcji.
Oczywiście system Windows używa (używanego) ukośnika „
/
”, aby wskazać opcje zamiast myślnika-
”.JCL (dla systemów z / OS i OS / 360 oraz systemów pośrednich) zwykle używa parametrów pozycyjnych oddzielonych przecinkami i jest ogólnie uważany za nieprzyjazny dla użytkownika lub dobry interfejs.
źródło
git
.EDYCJA: Wskazano, że ten styl jest GNU-izmem i że Uniksy oparte na GNU zwykle używają składni pojedynczego myślnika (w szczególności wariantów OS X i BSD).
Pomimo statusu GNU-ism, wiele nowo napisanych programów w stylu uniksowym używa tego stylu:
--long-option
dla długich nazw opcji,-s
dla krótkich (jednoznakowych) opcji,-abc
dla wielu krótkich opcji bez argumentów (jeden znak na opcję).--long arg
lub--long=arg
dla długich opcji,-s arg
,-sarg
I (opcjonalnie)-s=arg
do krótkich opcji. Można to połączyć z innymi krótkimi opcjami, o ile tylko ostatnia ma argument.Każdy, kto używał powłoki Linuksa przez dłuższy czas, powinien znać ten styl 1 , więc ma on zasadę najmniejszego zaskoczenia po swojej stronie. Przyjemne jest również grupowanie wielu krótkich opcji bez dwuznaczności przy długich opcjach.
1 Na przykład, niektóre z programów wykorzystujących ten styl (na moim komputerze Linux):
ls
,grep
,man
,sed
,bash
, itd. ( EDIT: są to widocznie gnu-izmy choć maszyny BSD i OS X nie używają tego stylu)Istnieje kilka bibliotek, które mogą zająć parsowania to dla ciebie (najbardziej znany jest realizacja GNU z getopt ), tylko potrzebuje was, aby określić co długie i krótkie opcje istnieją, czy biorą argument, i co zrobić, gdy opcja jest znaleziona. (I, oczywiście, co zrobić z argumentami pozycyjnymi, tj. Takimi, które nie zaczynają się od
-
i nie są argumentami dla poprzednich opcji)find
to bardzo stary program (a może bardziej prawdopodobne: przerobiona wersja bardzo starego programu), którego nie można łatwo zmienić w celu użycia nowej składni wiersza poleceń. Zepsuje się zbyt wiele skryptów, a zbyt wielu użytkowników przyzwyczajonych do starej składni narzeka.javac
był prawdopodobnie pod wpływemgcc
przyjaciół i znajomych, którzy również stosują starą składnię z powodów historycznych.źródło
--long-arg
) jest konwencją GNU (zobacz ich implementację getopt ).W przypadku projektu Java warto sprawdzić GNU getopt for Java lub Apache CLI . Wspierają obie konwencje.
Trzecią opcją jest użycie argumentów Java VM i pozwolenie, aby środowisko wykonawcze je przeanalizowało:
A następnie w kodzie:
Osobiście
-D
używałbym tego idiomu i zawijałem inkantację Java w skrypcie powłoki, który obsługuje parsowanie wiersza poleceń, w tym sprawdzanie ścieżki klasy itp. Ułatwia to również rodzimym użytkownikom uruchamianie programu Java.źródło
To zależy. Ja osobiście wolę styl POSIX, ale w twoim przypadku prawdopodobnie dążyłbym do spójności ze środowiskiem, w którym twoje narzędzie będzie używane. Oznacza to stosowanie konwencji JAR dla plików JAR (chyba że planujesz mieć skrypt otoki, który wyglądałby jak typowa komenda uniksowa).
źródło