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 -l
zmienna format
jest 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 -l
flag. ls
potrzebuje więcej czasu, aby uzupełnić o wiele -l
flag. 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_OPTIONS
już 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ąć.
-l
moż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, $CFLAGS
które mogą powielać opcje jawne w konkretnym wywołaniu kompilatora.
ls
z pewnym zestawem opcji.
-l
w swoich ls
alias wydaje się złym pomysłem, ten sam problem może wynikać z opcji, które są miłe w interaktywnym ls
alias podobnego -p
lub --color=auto
.
ls
. ll
może być pseudonimem ls -l
, a w systemie z tym pseudonimem mogę pisać ll -lart
.
ls
nie jest bash
poleceniem, ale osobnym plikiem wykonywalnym, z którego się uruchamiasz bash
. To powiedziawszy, -l
jest tylko rodzajem flagi boolowskiej, która, jeśli jest obecna, powoduje ls
użycie formatu długiego stylu dla danych wyjściowych. Większość programów po prostu zignoruje wielokrotne użycie takich flag ( ls -ll
jest takie samo jak ls -l -l
), chociaż istnieją pewne wyjątki (na przykład, jeśli -v
oznacza „gadatliwy”, wówczas program może interpretować wielokrotne użycie, co oznacza „być jeszcze bardziej gadatliwym”).
-vvv
jest ssh
.
aptitude moo
Aliasy powłoki byłyby dość denerwujące, gdyby takie polecenia ls
nie 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=never
lub ls --color=auto
lub rm -i
.
Dlatego te polecenia zostały zaprojektowane tak, aby późniejsze flagi zastępowały wcześniejsze.
--inplace
i --delay-updates
na przykład.) Niektóre narzędzia biorą to, co jest ostatnie; rm -if
jest prawdopodobnie dobrym przykładem. Ale nie ma konfliktu z opcją -l ls-tych, a więc ls -l
i ls -ll
nie jest problemem, a nie wpływa na wykonywanie jakiejkolwiek istotnej sposób. Komputery są dobre w odrętwiającym powtarzaniu.