Dlaczego akceptuje zduplikowane przełączniki?


16

Jestem ciekawy - czy jest różnica między ls -li ls -lllllllllllllllllllllllllllll?

Wynik wydaje się być taki sam i nie jestem pewien, dlaczego lspozwala na duplikowanie przełączników. Czy to standardowa praktyka wśród większości poleceń?

Odpowiedzi:


17

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ć. =)


11
Innymi słowy, odrzucenie ich byłoby dla programisty więcej pracy niż ich zignorowanie.
Mark

1
+0,5 za powiedzenie tego, co chciałem powiedzieć, +0,5 za przejście do źródła.
CVn

@Mark - Dlaczego programista ma więcej pracy?
Ryan

@ Ryan, odrzucenie dodatkowej opcji „l” wymaga śledzenia liczby widzianych i drukowania komunikatu o błędzie, jeśli jest ich zbyt wiele. Ignorowanie dodatkowych opcji „l” wymaga po prostu ustawienia stylu formatu na „long_format” za każdym razem, gdy pojawi się „l”.
Mark

@ Mark - Myślałem, że łatwiej będzie wykonać liczbę l, a jeśli przekroczy 1, wydrukuj błąd.
Ryan

21

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.


4
To samo może się zdarzyć, jeśli zdefiniujesz alias, który wywołuje się lsz pewnym zestawem opcji.
kasperd

1
@kasperd: Tak. Chociaż wprowadzenie -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.
R .. GitHub ZATRZYMAJ LÓD

1
Alias ​​nie musi być wywoływany ls. llmoże być pseudonimem ls -l, a w systemie z tym pseudonimem mogę pisać ll -lart.
kasperd

11

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”).


2
Przykładem -vvvjest ssh.
Bernhard,

Lub nawetaptitude moo
Ruslan

8

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.


Sprzeczne przełączniki są czasami niedozwolone. (Wypróbuj rsync z obydwoma --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.
CVn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.