Відповіді:
Коротка відповідь :
Тому що він запрограмований ігнорувати багаторазове використання прапора.
Довга відповідь:
Як ви можете бачити в вихідному коді з 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
не є проблемою, і це не впливає на виконання будь - яких істотно. Комп'ютери добре сприймають втому.