Jestem ciekawy - czy jest różnica między ls -l
i ls -lllllllllllllllllllllllllllll
?
Wynik wydaje się być taki sam i nie jestem pewien, dlaczego ls
pozwala na duplikowanie przełączników. Czy to standardowa praktyka wśród większości poleceń?
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:
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.źródło
ls
z pewnym zestawem opcji.-l
w swoichls
alias wydaje się złym pomysłem, ten sam problem może wynikać z opcji, które są miłe w interaktywnymls
alias podobnego-p
lub--color=auto
.ls
.ll
może być pseudonimemls -l
, a w systemie z tym pseudonimem mogę pisaćll -lart
.ls
nie jestbash
poleceniem, ale osobnym plikiem wykonywalnym, z którego się uruchamiaszbash
. To powiedziawszy,-l
jest tylko rodzajem flagi boolowskiej, która, jeśli jest obecna, powodujels
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 jakls -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”).źródło
-vvv
jestssh
.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ś
Następnie, jeśli konfliktowe flagi nie byłyby dozwolone, błędem byłoby wydawanie poleceń takich jak
ls --color=never
lubls --color=auto
lubrm -i
.Dlatego te polecenia zostały zaprojektowane tak, aby późniejsze flagi zastępowały wcześniejsze.
źródło
--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ęcls -l
ils -ll
nie jest problemem, a nie wpływa na wykonywanie jakiejkolwiek istotnej sposób. Komputery są dobre w odrętwiającym powtarzaniu.