Na przykład:
xargs -n 1
jest taki sam jak
xargs -n1
Ale jeśli spojrzysz na stronę man , opcja jest wymieniona jako -n max-args
, co oznacza, że przestrzeń ma zostać zachowana. Nie ma nic w skróconej formie -n max-args .
Dzieje się tak również w przypadku wielu innych narzędzi systemu Linux.
Jak to się nazywa w systemie Linux? Czy wszystkie narzędzia obsługują skróconą formę (ale nigdy nie dokumentują jej na stronie podręcznika)?
Odpowiedzi:
Kiedy piszesz bit parsowania wiersza poleceń swojego kodu, określasz, które opcje przyjmują argumenty, a które nie. Na przykład w skrypcie powłoki akceptującym
-h
opcję (na przykład pomoc) i-a
opcję, która powinna przyjąć argument, robisza:h
Bit mówi „Czekam analizować dwie opcje,-a
i-h
, i-a
powinna podjąć argument” (jest to:
poa
to mówi parser który-a
pobiera argumentu).Dlatego nigdy nie ma dwuznaczności, gdzie kończy się opcja, gdzie zaczyna się jej wartość, a gdzie zaczyna się kolejna.
Uruchamianie:
Właśnie dlatego przez większość czasu nie powinieneś pisać własnego parsera wiersza poleceń do analizowania opcji.
W tym przykładzie jest tylko jeden przypadek, który jest trudny. Analiza zwykle kończy się przy pierwszej opcji, więc gdy w wierszu polecenia masz elementy wyglądające jak opcje:
Następujące rozwiązuje, że:
Te
--
sygnały końca opcji wiersza poleceń, a-world
bit zostaje w programie robić co chce z (to jest w jednej ze zmiennych pozycyjnych).Tak przy okazji, usuwasz plik z myślnikiem na początku jego nazwy za pomocą
rm
.EDYCJA :
Narzędzia napisane w wywołaniu C
getopt()
(zadeklarowane wunistd.h
), które działają prawie tak samo. W rzeczywistości, wszyscy wiemy,bash
funkcjagetopts
może być realizowana za pomocą wywołanie funkcji biblioteki Cgetopt()
. Perl, Python i inne języki mają podobne biblioteki parsujące wiersze poleceń i najprawdopodobniej przeprowadzają parsowanie w podobny sposób.Niektóre z tych
getopt
igetopt
podobnych procedur bibliotecznych obsługują również „długie” opcje. Są one zwykle poprzedzone podwójnym myślnikiem (--
), a długie opcje, które pobierają argumenty, często robią to po znaku równości, na przykład--block-size=SIZE
opcja [niektóre implementacje]du
narzędzia (które pozwala również na-B SIZE
określenie tej samej rzeczy).Powodem, dla którego podręczniki są często pisane, aby pokazać odstęp między krótkimi opcjami i ich argumentami, jest prawdopodobnie czytelność.
EDYCJA : Naprawdę stare narzędzia, takie jak
dd
itar
narzędzia, mają przed sobą opcje bez myślników. Wynika to wyłącznie z przyczyn historycznych i dla zachowania zgodności z oprogramowaniem, które polega na tym, że działają w ten właśnie sposób.tar
Narzędzie zyskał zdolność do podejmowania opcje z kreskami w ostatnich czasach. Podręcznik BSD dotar
wywoływania opcji w starym stylu dla „flag pakietowych”.źródło
getopt()
(deklarowane wunistd.h
), co robi to samo.-a -b
===-ab
-a
ma opcjonalny argument,-ab
to nie to samo, co-a -b
). GNU getopt nie zatrzymuje przetwarzania flag po spotkaniu z nie-flagą: zamiast tego (domyślnie), zamiast tego przetasowuje flagi na przód argv.xargs
jest jednym z narzędzi POSIX. Jak skomentował @drewbenn, POSIX dokumentuje zachowanie parsowania opcji dla większości swoich narzędzi do dopasowaniagetopt
, z pewnymi tolerancjami dla innych implementacji, mówiąc w 12.1 Składnia argumentu narzędzia :i kończąc z
W POSIX (pamiętaj, że obejmuje on tylko najczęściej używane narzędzia), istnieją wyjątki, które przekazują operandy, które byłyby opcjami w innych narzędziach jako parametry pozycyjne lub parametry o specjalnej składni :
POSIX pozwala na opcjonalne wartości opcji:
Nie pamiętam, które narzędzia POSIX używają tej funkcji. Ncurses
tic
iinfocmp
narzędzia używają tej funkcji dla poziomów opcji-v
(pełne / debugowanie).Konkretny punkt, o który pytałeś, jest szczegółowo opisany w pozostałej części tego akapitu, w kilku wierszach.
Przed POSIX-em niektóre implementacje
ps
zaakceptowanych opcji bez łącznika wiodącego. Opis POSIX nie wspomina o tym w opisie narzędzia ani w uzasadnieniu składni:Oprócz POSIX istnieją implementacje długich opcji (takie jak GNU getopt_long lub X Toolkit ), wykorzystujące różne sposoby oddzielania lub łączenia wartości opcji z opcją. Na przykład można zastosować interpunkcję:
W zależności od implementacji podwójny myślnik może / nie może być użyty do odróżnienia długich opcji od krótkich (getopt): Lynx i X Toolkit używają pojedynczego myślnika; Na przykład GNU
getopt_long
używa podwójnego myślnika. Można również+
użyć a, aby wskazać, że opcja jest zanegowana.Opis POSIX nie wydaje się wymieniać żadnego z nich, ale na pewno je spotkasz.
źródło
-option=value
ma być--option=value
? (Format długiej opcji, dwa myślniki na początku zamiast jednego)