W systemach POSIX (np. Linux, MacOSX), przynajmniej w przypadku programów, które mogą być uruchamiane w terminalu powłoki (np. Większość z nich), zaleciłbym użycie konwencji kodowania GNU (które również zawierają listę popularnych nazw argumentów) i przyjrzenie się wytycznym narzędzi POSIX , nawet w przypadku oprogramowania zastrzeżonego:
zawsze obsługuj --versioni--help (nawet /bin/trueje akceptuje !!). Przeklinam autorów oprogramowania, którzy nie rozumieją --help, nienawidzę ich (bo prog --help to pierwsze polecenie, które próbuję na nowym programie)! Często --helpmożna je skrócić jako-h
Poproś, aby --helplista zawierała wszystkie opcje (chyba że masz ich zbyt wiele ... w takim przypadku wypisz najczęściej używane i wyraźnie odnieś się do jakiejś manstrony lub adresu URL) i wartości domyślne opcji, a być może ważne (i specyficzne dla programu ) Zmienne środowiska. Pokaż te listy opcji w przypadku błędu argumentu opcji.
zaakceptować -akrótki argumentu (jedna litera) i mieć jakiś odpowiednik --long-argument, tak -a2 --long-argument=2, --long-argument 2; oczywiście możesz mieć (dla rzadko używanych opcji) jakąś --only-long-argumentnazwę; dla argumentów modalnych bez dodatkowych opcji -cfjest zwykle traktowany jako -c -fitp., więc twoja -argument:valuepropozycja jest dziwna i nie polecam tego robić.
użyj GLIBC getopt_long lub lepszego (np. argp_parse , w OCaml jest to Argmoduł , ...)
często wykorzystują -do standardowego wejścia lub wyjścia (jeśli nie można tego zrobić, uchwyt /dev/stdini /dev/stdoutnawet na kilka systemów operacyjnych ich nie posiadające)
naśladować zachowanie podobnych programów poprzez ponowne wykorzystanie większości konwencji opcji; w szczególności -nna sucho (à la make), -hpo pomoc, -vza gadatliwość itp.
użyj --jako separatora między opcjami i plikiem lub innymi argumentami
jeśli twój program używa isattydo testowania niż stdin jest terminalem (w takim przypadku zachowuje się „interaktywnie”), zapewnij opcję wymuszenia trybu nieinteraktywnego, podobnie jeśli twój program ma interfejs GUI (i testy getenv("DISPLAY")na pulpicie X11), ale może również być używane w partii lub wierszu poleceń.
Niektóre programy (np. gcc) Akceptują pośrednie listy argumentów, co @somefile.txtoznacza odczyt argumentów programu z somefile.txt; może to być przydatne, gdy twój program może zaakceptować bardzo dużą liczbę argumentów (więcej niż jądro ARG_MAX)
BTW, możesz nawet dodać funkcje automatycznego uzupełniania dla swojego programu i zwykłe powłoki (jak bashlub zsh)
Niektóre stare polecenia uniksowe (np. ddLub nawet sed) mają dziwne argumenty poleceń dla historycznej zgodności. Radziłbym nie podążać za ich złymi nawykami (chyba że robisz jakiś lepszy wariant).
Jeśli oprogramowanie jest seria programów związanych z wiersza polecenia, czerpać inspirację z git (co na pewno użyć jako narzędzie rozwoju), która akceptuje git helpi git --helpi mają wiele gitsubcommandigitsubcommand--help
W rzadkich przypadkach możesz także użyć argv[0](używając dowiązań symbolicznych w swoim programie), np. bashWywołać, ponieważ rbashma inne zachowanie ( ograniczona powłoka). Ale zwykle nie polecam tego robić; może mieć sens, jeśli twój program może być używany jako interpreter skryptów za pomocą shebang, tj. #!w pierwszej linii interpretowanej przez execve (2) . Jeśli wykonujesz takie sztuczki, pamiętaj o ich udokumentowaniu, w tym w --helpwiadomościach.
Pamiętaj, że na POSIX powłoka jest globbing argumenty ( zanim uruchomiony program!), Więc uniknąć konieczności znaków (jak *lub $czy ~) w opcji, które musiałyby być powłoki uciekł.
W niektórych przypadkach możesz wbudować interpreter taki jak GNU Guile lub Lua w swoim oprogramowaniu (unikaj wymyślania własnego języka skryptowego pełnego Turinga, jeśli nie jesteś ekspertem w językach programowania). Ma to głębokie konsekwencje dla projektu twojego oprogramowania (należy o tym pomyśleć wcześnie!). Powinieneś wtedy łatwo przekazać skryptowi lub wyrażeniu temu tłumaczowi. Jeśli zastosujesz to interesujące podejście, ostrożnie zaprojektuj swoje oprogramowanie i jego interpretowane prymitywy; możesz mieć dziwnego użytkownika kodującego duże skrypty dla swojej rzeczy.
W innych przypadkach możesz pozwolić zaawansowanym użytkownikom na załadowanie wtyczki do twojego oprogramowania (przy użyciu technik dynamicznego ładowania à la dlopen& dlsym). Ponownie, jest to bardzo ważna decyzja projektowa (więc ostrożnie zdefiniuj i udokumentuj interfejs wtyczki) i musisz zdefiniować konwencję, aby przekazywać opcje programu do tych wtyczek.
Jeśli twoje oprogramowanie jest skomplikowane, pozwól mu akceptować niektóre pliki konfiguracyjne (oprócz lub zastępowanie argumentów programu) i prawdopodobnie masz jakiś sposób na przetestowanie (lub po prostu parsowanie) tych plików konfiguracyjnych bez uruchamiania całego kodu. Na przykład agent przesyłania poczty (taki jak Exim lub Postfix) jest dość złożony i przydatna jest możliwość „półsuchego” jego uruchomienia (np. Obserwowanie, jak obsługuje określony adres e-mail bez faktycznego wysyłania wiadomości e-mail).
Zauważ, że /optionjest to Windows lub VMS. Byłoby to szalone w systemach POSIX (ponieważ hierarchia plików używa /jako separatora katalogów i ponieważ powłoka wykonuje globowanie). Cała moja odpowiedź dotyczy głównie Linuksa (i POSIX).
PS Jeśli to możliwe, uczyń swój program wolnym oprogramowaniem , otrzymasz ulepszenia od niektórych użytkowników i programistów (a dodanie nowej opcji programu jest często jedną z najłatwiejszych rzeczy do dodania do istniejącego bezpłatnego oprogramowania). Ponadto twoje pytanie zależy w dużej mierze od zamierzonej publiczności : gra dla nastolatków lub przeglądarka dla babci prawdopodobnie nie potrzebuje tego samego rodzaju i ilości opcji niż kompilator lub inspektor sieci dla sysadminów centrum danych lub oprogramowanie CAD dla mikroprocesora architekci lub projektanci mostów. Inżynier zaznajomiony z programowaniem i skryptami prawdopodobnie lubi dużo więcej możliwości dostrajania niż twoja babcia i prawdopodobnie może chcieć móc uruchomić twoją aplikację bez X11 (być może w crontabpracy).
ls -ltraby połączyć opcje-l,-ti-r. Programy w stylu GNU zazwyczaj zezwalają również na opcje oparte na słowach z podwójnym myślnikiem--reversezamiast-r. Istnieją inne popularne konwencje, takie jak-hpokazywanie pomocy,--sygnalizowanie końca opcji, określanie-jako nazwy pliku umożliwiającej czytanie ze standardowego wejścia itp.