Мне любопытно - есть ли разница между ls -l
и ls -lllllllllllllllllllllllllllll
?
Выходные данные выглядят одинаково, и я не понимаю, почему ls
допускаются дублирующие переключатели. Это стандартная практика среди большинства команд?
Краткий ответ :
Потому что он запрограммирован на игнорирование многократного использования флага.
Длинный ответ:
Как вы можете видеть в исходном коде из 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_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
не позволяли повторять опции.Предположим, вы имели
Тогда, если конфликтующие флаги не были разрешены, было бы ошибкой выдавать команды вроде
ls --color=never
илиls --color=auto
илиrm -i
.Следовательно, эти команды предназначены для того, чтобы более поздние флаги перекрывали более ранние.
источник
--inplace
и--delay-updates
, например.) Некоторые инструменты просто берут то, что последним;rm -if
Вероятно, хороший пример там. Но в параметре ls -l конфликта нет, следовательно,ls -l
иls -ll
это не проблема, и это никак не влияет на выполнение. Компьютеры хороши в умопомрачительном повторении.