Odpowiedzi:
Krótka odpowiedź :
Ponieważ jest zaprogramowany do ignorowania wielokrotnego użycia flagi.
Długa odpowiedź:
Jak widać w kodzie źródłowym z ls, jest część z funkcją getopt_long()i ogromny przypadku przełącznika:
1648 int c = getopt_long (argc, argv,
1649 "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
1650 long_options, &oi);
....
1654 switch (c)
1655 {
....
1707 case 'l':
1708 format = long_format;
1709 break;
....
1964 }
Funkcja getopt_long()odczytuje wszystkie parametry przekazane do programu. W przypadku, gdy -lzmienna formatjest ustawiona. Więc kiedy wpiszesz wiele-lllllllll , zmienna jest ustawiana wiele razy, ale to nic nie zmienia.
Cóż, zmienia jedno. Ta ogromna instrukcja przypadku przełącznika musi być uruchamiana wiele razy, z powodu wielu -lflag. lspotrzebuje więcej czasu, aby uzupełnić o wiele -lflag. Ale tym razem nie warto wspominać. =)
Ponieważ to jest właściwe. Załóżmy, że masz skrypt wykonujący coś takiego:
ls $LS_OPTIONS -l "$dir"
gdzie to możliwe, że $LS_OPTIONSjuż zawiera -l. To byłoby sprzeczne z intuicją i irytujące, gdyby to polecenie spowodowało błąd i wymagałoby dodatkowej logiki w skrypcie, aby tego uniknąć.
-lmoże nie być najlepszym tego przykładem, ale mam nadzieję, że zobaczysz, jak ogólnie ta koncepcja ma zastosowanie. Znacznie lepszym przykładem są opcje kompilatora, $CFLAGSktóre mogą powielać opcje jawne w konkretnym wywołaniu kompilatora.
lsz pewnym zestawem opcji.
-lw swoich lsalias wydaje się złym pomysłem, ten sam problem może wynikać z opcji, które są miłe w interaktywnym lsalias podobnego -plub --color=auto.
ls. llmoże być pseudonimem ls -l, a w systemie z tym pseudonimem mogę pisać ll -lart.
lsnie jest bashpoleceniem, ale osobnym plikiem wykonywalnym, z którego się uruchamiasz bash. To powiedziawszy, -ljest tylko rodzajem flagi boolowskiej, która, jeśli jest obecna, powoduje lsużycie formatu długiego stylu dla danych wyjściowych. Większość programów po prostu zignoruje wielokrotne użycie takich flag ( ls -lljest takie samo jak ls -l -l), chociaż istnieją pewne wyjątki (na przykład, jeśli -voznacza „gadatliwy”, wówczas program może interpretować wielokrotne użycie, co oznacza „być jeszcze bardziej gadatliwym”).
-vvvjest ssh.
aptitude moo
Aliasy powłoki byłyby dość denerwujące, gdyby takie polecenia lsnie pozwalały na powtarzanie opcji.
Załóżmy, że miałeś
alias ls='ls --color=auto'
alias rm='rm -i'
Następnie, jeśli konfliktowe flagi nie byłyby dozwolone, błędem byłoby wydawanie poleceń takich jak ls --color=neverlub ls --color=autolub rm -i.
Dlatego te polecenia zostały zaprojektowane tak, aby późniejsze flagi zastępowały wcześniejsze.
--inplacei --delay-updatesna przykład.) Niektóre narzędzia biorą to, co jest ostatnie; rm -ifjest prawdopodobnie dobrym przykładem. Ale nie ma konfliktu z opcją -l ls-tych, a więc ls -li ls -llnie jest problemem, a nie wpływa na wykonywanie jakiejkolwiek istotnej sposób. Komputery są dobre w odrętwiającym powtarzaniu.