Ответы:
Краткий ответ :
Потому что он запрограммирован на игнорирование многократного использования флага.
Длинный ответ:
Как вы можете видеть в исходном коде из 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Вероятно, хороший пример там. Но в параметре ls -l конфликта нет, следовательно, ls -lи ls -llэто не проблема, и это никак не влияет на выполнение. Компьютеры хороши в умопомрачительном повторении.