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