Чому ls приймає повторювані перемикачі?


16

Мені цікаво - чи є різниця між ls -lі ls -lllllllllllllllllllllllllllll?

Схоже, вихід такий же, і я плутаюся, чому lsдозволяє повторювати перемикачі. Це стандартна практика серед більшості команд?

Відповіді:


17

Коротка відповідь :

Тому що він запрограмований ігнорувати багаторазове використання прапора.

Довга відповідь:

Як ви можете бачити в вихідному коді з 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прапорів. Але цей час не варто згадувати. =)


11
Або, по-іншому, відхилення їх буде більше роботою для програміста, ніж їх ігнорування.
Марк

1
+0,5 за те, що я сказав, +0,5 для переходу до джерела.
CVn

@Mark - Чому це більше працює для програміста?
Райан

@Ryan, відхилення додаткової опції "l" вимагає відстежувати кількість переглянутих та друкувати повідомлення про помилку, якщо їх занадто багато. Ігнорування додаткових параметрів "l" просто вимагає встановити стиль формату на "long_format" будь-коли, коли буде показано "l".
Позначте

@Mark - я б подумав, що простіше виконати підрахунок l, і якщо він перевищує 1, надрукуйте помилку.
Райан

21

Тому що це правильно робити. Припустимо, у вас був сценарій, який робив щось на кшталт:

ls $LS_OPTIONS -l "$dir"

де можливо, що $LS_OPTIONSвже містить -l. Для цієї команди було б контр-інтуїтивно зрозуміти і дратувати помилку, і в сценарії знадобиться додаткова логіка, щоб її уникнути.

-lможе бути не найкращим прикладом для цього, але, сподіваємось, ви можете побачити, як концепція застосовується взагалі. Набагато кращим прикладом є варіанти компілятора, $CFLAGSякі можуть дублювати явні параметри в певному виклику компілятора.


4
Те ж саме може статися, якби ви визначили псевдонім, який дзвонить lsіз деяким набором опцій.
kasperd

1
@kasperd: Так. Хоча розміщення -lсвого lsпсевдоніма здається поганою ідеєю, ймовірність виникнення того ж питання з варіантами, які є приємними в інтерактивному lsпсевдонімі, як -pабо --color=auto.
R .. GitHub СТОП ДОПОМОГАТИ ВІД

1
Псевдонім не потрібно називати ls. llможе бути псевдонімом ls -l, і в системі з цим псевдонімом я можу ввести ll -lart.
kasperd

11

lsце не bashкоманда, а окремий виконуваний файл, з якого вам трапляється запускати bash. Сказане - -lце лише тип булевого прапора, який, якщо він присутній, змушує lsвикористовувати формат довгого стилю для виводу. Більшість програм просто ігнорують багаторазове використання ( ls -llце те саме, що ls -l -l) таких прапорів, хоча є і деякі винятки (як приклад, якщо -vозначає "багатослівний", то програма може інтерпретувати багаторазове використання, що означає "бути ще більш багатослівним").


2
Прикладом -vvvє ssh.
Бернхард

Або навітьaptitude moo
Руслан

8

Псевдонії оболонки були б дуже прикрими, якби команди типу lsне дозволяли повторювати параметри.

Припустимо, у вас був

alias ls='ls --color=auto'
alias rm='rm -i'

Тоді, якщо суперечливі прапори не були дозволені, було б помилкою видавати команди на зразок ls --color=neverабо ls --color=autoабо rm -i.

Тому ці команди призначені для того, щоб пізніші прапори перекривали попередні.


Конфліктні перемикачі іноді заборонено. (Спробуйте Rsync з обома --inplaceі --delay-updates, наприклад) . Деякі інструменти просто взяти все , що приходить в останній раз ; rm -ifмабуть, хороший приклад там. Але немає ніякого конфлікту в опції -l Ls, а значить , ls -lі ls -llне є проблемою, і це не впливає на виконання будь - яких істотно. Комп'ютери добре сприймають втому.
CVn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.