Відповіді:
Коротка відповідь :
Тому що він запрограмований ігнорувати багаторазове використання прапора.
Довга відповідь:
Як ви можете бачити в вихідному коді з ls, є частина з функцією getopt_long()і величезним перемикачем випадком:
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 }
Функція getopt_long()зчитує всі параметри, задані програмі. У разі якщо -lвстановлена змінна format. Отже, коли ви вводите множину, -lllllllllця змінна встановлюється кілька разів, але це нічого не змінює.
Ну, це змінює одне. Цей величезний випадок випадку перемикання повинен виконуватись кілька разів через безліч -lпрапорів. lsпотрібно довше, щоб виконати кілька -lпрапорів. Але цей час не варто згадувати. =)
Тому що це правильно робити. Припустимо, у вас був сценарій, який робив щось на кшталт:
ls $LS_OPTIONS -l "$dir"
де можливо, що $LS_OPTIONSвже містить -l. Для цієї команди було б контр-інтуїтивно зрозуміти і дратувати помилку, і в сценарії знадобиться додаткова логіка, щоб її уникнути.
-lможе бути не найкращим прикладом для цього, але, сподіваємось, ви можете побачити, як концепція застосовується взагалі. Набагато кращим прикладом є варіанти компілятора, $CFLAGSякі можуть дублювати явні параметри в певному виклику компілятора.
lsіз деяким набором опцій.
-lсвого lsпсевдоніма здається поганою ідеєю, ймовірність виникнення того ж питання з варіантами, які є приємними в інтерактивному lsпсевдонімі, як -pабо --color=auto.
ls. llможе бути псевдонімом ls -l, і в системі з цим псевдонімом я можу ввести ll -lart.
lsце не bashкоманда, а окремий виконуваний файл, з якого вам трапляється запускати bash. Сказане - -lце лише тип булевого прапора, який, якщо він присутній, змушує lsвикористовувати формат довгого стилю для виводу. Більшість програм просто ігнорують багаторазове використання ( ls -llце те саме, що ls -l -l) таких прапорів, хоча є і деякі винятки (як приклад, якщо -vозначає "багатослівний", то програма може інтерпретувати багаторазове використання, що означає "бути ще більш багатослівним").
-vvvє ssh.
aptitude moo
Псевдонії оболонки були б дуже прикрими, якби команди типу lsне дозволяли повторювати параметри.
Припустимо, у вас був
alias ls='ls --color=auto'
alias rm='rm -i'
Тоді, якщо суперечливі прапори не були дозволені, було б помилкою видавати команди на зразок ls --color=neverабо ls --color=autoабо rm -i.
Тому ці команди призначені для того, щоб пізніші прапори перекривали попередні.
--inplaceі --delay-updates, наприклад) . Деякі інструменти просто взяти все , що приходить в останній раз ; rm -ifмабуть, хороший приклад там. Але немає ніякого конфлікту в опції -l Ls, а значить , ls -lі ls -llне є проблемою, і це не впливає на виконання будь - яких істотно. Комп'ютери добре сприймають втому.