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 --version
i--help
(nawet /bin/true
je 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 --help
można je skrócić jako-h
Poproś, aby --help
lista 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ś man
strony 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ć -a
kró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-argument
nazwę; dla argumentów modalnych bez dodatkowych opcji -cf
jest zwykle traktowany jako -c -f
itp., więc twoja -argument:value
propozycja jest dziwna i nie polecam tego robić.
użyj GLIBC getopt_long lub lepszego (np. argp_parse , w OCaml jest to Arg
moduł , ...)
często wykorzystują -
do standardowego wejścia lub wyjścia (jeśli nie można tego zrobić, uchwyt /dev/stdin
i /dev/stdout
nawet 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 -n
na sucho (à la make
), -h
po pomoc, -v
za gadatliwość itp.
użyj --
jako separatora między opcjami i plikiem lub innymi argumentami
jeśli twój program używa isatty
do 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.txt
oznacza 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 bash
lub zsh
)
Niektóre stare polecenia uniksowe (np. dd
Lub 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 help
i git --help
i mają wiele git
subcommand
igit
subcommand
--help
W rzadkich przypadkach możesz także użyć argv[0]
(używając dowiązań symbolicznych w swoim programie), np. bash
Wywołać, ponieważ rbash
ma 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 --help
wiadomoś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 /option
jest 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 crontab
pracy).
ls -ltr
aby połączyć opcje-l
,-t
i-r
. Programy w stylu GNU zazwyczaj zezwalają również na opcje oparte na słowach z podwójnym myślnikiem--reverse
zamiast-r
. Istnieją inne popularne konwencje, takie jak-h
pokazywanie pomocy,--
sygnalizowanie końca opcji, określanie-
jako nazwy pliku umożliwiającej czytanie ze standardowego wejścia itp.