Чому термінал залежить від регістру?


13

Коли я це роблю - CD ..замість цього cd ..
він дає мені помилку, кажучи -

CD: command not found

Чому термінальний регістр чутливий, якщо мова йде про команди Linux? Я маю на увазі, що ви повинні мати можливість виконувати команду або з усіма великими літерами, або з усіма малими літерами.

Я знаю, це пов'язано з якихось причин, але мені просто цікаво.


9
Я майже відчуваю, що це питання має бути перейменоване Чому речі залежать від регістру?
kojiro

15
"Я маю на увазі, ви повинні мати можливість виконувати команду або з символами" всі великі регістри ", або" всі малі регістри "." Дійсно? Чому?
dmckee --- кошеня колишнього модератора

5
Випустіть, stty iuclc olcucякщо вам здається, що термінал нечутливий до справи ;-)
Stéphane Chazelas

1
CapsLock + c + d + CapsLock гірше c + d
UniversallyUniqueID

Відповіді:


43

Зрештою, це був довільний вибір, який зробили творці Unix більше чотирьох десятиліть тому. Вони могли вирішити зробити такі речі нечутливими до справ, як це робили творці MS-DOS через десятиліття пізніше, але і це має свої недоліки.

Це занадто глибоко вбудовано в культуру * ix, щоб змінити її зараз. Проблема файлової системи з урахуванням регістру, піднята eppesuig, є лише її частиною. Системи macOS - які базуються на Unix - зазвичай мають файлові системи, що не чутливі до регістру (але зберігають регістр), тому в таких системах команди, зовнішні до оболонки, насправді трактуються без регістру. Але подібні побудовиcd залишаються залежними від регістру.

Навіть із файловою системою, що не враховує регістр, історія речей змовляється проти ваших побажань, Хуссейне. Якщо я набираю lsсвій Mac, я отримую кольоровий список каталогів. Якщо я набираю LSнатомість, він /bin/lsвсе ще працює, але список не забарвлений, оскільки псевдонім, який додає -Cпрапор, залежить від регістру.

Краще просто звикнути до цього. Якщо можете, навчіться сподобатися.


1
Насправді файли Windows можуть залежно від регістру. Наприклад, вони перебувають у підсистемі POSIX та дивіться msdn.microsoft.com/en-us/library/ee681827%28v=vs.85%29.aspx
fpmurphy

3
Це насправді дивно, оскільки деякі загальні термінали, наявні на той час, були лише великими літерами, і їм довелося здійснити обхідний шлях (покладіть зворотну косу рису перед літерою, якщо ви хочете, щоб вона була справді великою літерою - увімкнено, якщо ви вводили своє ім'я користувача у великі регістри під час входу в систему в) у водії лінійної дисципліни.
Випадково832

8

Це не проблема "терміналу", це особливість файлової системи. Як оболонка повинна шукати ваші команди в файловій системі (завжди залежної від регістру)?


А що, якщо збігаються дві чи більше команд?
scai

1
Єдиний варіант, який може вам трохи допомогти - це bashваріант, який називається cdspell: спробуйте знайти правильне ім'я файлу, навіть якщо ви ввели його неправильно, але він працює лише для аргументів команди .
eppesuig

1
@HussainTamboli Там можуть бути команди з ім'ям cd, CD, cDі Cdкожен з унікальним поведінкою.
scai

6
Це насправді не функція файлової системи або функція терміналу - це функція оболонки. Shell вбудовані з урахуванням регістру файлової системи, нечутливої ​​до регістру. Крім того, більшість оболонок хеш-команд, тому команди ніколи насправді не файли, вони фактично витягнуті з хеша. Спробуйте, hash -p /bin/hostname HOSTNAMEі тепер HOSTNAMEце команда для /bin/hostname.
kojiro

2
О, я також повинен зазначити, що ви можете сказати, що більшість снарядів менш чутливі до регістру. За баш можна пов'язувати set completion-ignore-case on.
kojiro

6

Технічні системи, які я використовую та поважаю, майже виключно залежать від регістру: будь то ОС, мова програмування чи щось інше.

Винятки, про які я міг би зараз подумати, - це теги HTML та деякі реалізації SQL та мова програмування Ada.

Навіть у цих випадках я думаю, що існує сильна тенденція до написання HTML-тегів у малі регістри, а семантика запитів SQL у великому регістрі (і параметри з великої літери). (Виправте мене, якщо я помиляюся.) Що стосується Ада, режим Emacs виправить вас, якщо ви, наприклад, введете назву малої літери процедури, хоча це не має значення при компілюванні. Тож, навіть коли є нечутливість до випадків, люди здаються, що це погана ідея.

Причина в тому, що ви отримуєте набагато більше виразну силу з урахуванням регістру. Не тільки кількісно - CDце один, але CD, Cd, cDі cdчетверо - але що більш важливо, ви можете висловити мета, акцент і т.д. з використанням великих і малих розсудливо; також, програмуючи, ви підвищите читабельність.

Інтуїтивно зрозуміло, що ви не читаєте hiі HIтак само!

Але, щоб навести приклад комп'ютерного світу, в мові програмування Ada (з 1980-х років) перший рядок блоку коду процедури може виглядати так:

procedure body P(SCB : in out Semaphore_Control_Block) is

як бачите, імена процедур та параметрів з великої літери, як і типи даних, все інше є малі. Також зауважте, що назва параметра "всі великі регістри" говорить нам, що це абревіатура. А тепер порівняйте це

procedure body p(scb : in out semaphore_control_block) is

Це можливо, оскільки Ада нечутлива до регістру (або, якщо бути точним, компілятор змінить його так, як у моєму першому прикладі, але, звичайно, не змінить ваш код). Або як щодо:

PROCedure body P(Scb : IN Out semaphore_CONTROL_BLOCK) iS

Я знаю, що це трохи смішно; але хтось був би досить дурний, щоб написати це саме так (ну, можливо, ні). Справа в тому, що система, що враховує регістри, не тільки змусить людей бути послідовними, вони також їм допоможуть (читабельність) та використовуватимуть її на користь (приклад абревіатури вище).


2
Паскаль і Дельфи також нечутливі до регістру. Також, маючи, наприклад, дві змінні lengthі Lengthзазвичай погана ідея :)
Ajasja

@Ajasja: Це цікаво, адже Ада дуже схожа на Паскаля. Ну, я гадаю, якби ви порахували їх усіх, то таких мов було б багато, бо є так багато мов програмування. Що стосується довжини, звичайно - але ви, можливо, могли б придумати якийсь такий випадок: як щодо Макса (людина) та макса (функції, яка бере список дій і повертає найбільші)?
Емануель Берг

Стосовно вашого останнього прикладу, можливо, вам буде цікаво знати, що інтерпретатор SuperBasic QL з великої літери використовував великі літери саме таким чином: DEFine PROCedure Helloнаприклад. Вам потрібно було лише набрати великі літери, але повне слово з'явилося у списках програм. Це стосувалося і цього REMark, і це не дратувало ...
Давид Дано

4

Це не більш-менш дивно, ніж те, що у нас є алфавіт верхнього та нижнього регістру, з якого слід почати. Якщо ви заглянете /usr/bin, ви помітите, що (дуже) кілька виконуваних файлів використовують великі літери.

Простір імен, що чутливий до регістру, не просто вдвічі більший, ніж нечутливий - різниця зростає експоненціально з довжиною слова. Наприклад, використовуючи 26 символів, у трьох літерах є 26 ^ 3 (17576) різних можливостей; за допомогою 52 (2 * 26) символів існує 52 ^ 3 = 140608. Відкритий простір імен - це гарна річ;)


Звідки ви взяли 3?
ctrl-alt-delor

@ ctrl-alt-delor Це лише приклад: " в трьох літерах є 26 ^ 3 (17576) різних можливостей ".
goldilocks

2

Поняття «верхній / нижній» регістр може бути (і справді) специфікою для місцевості, яка, як і будь-яке інше ускладнення дизайну, повинна бути висунута якомога ближче до точки використання в стеку додатків, а не бути частиною серцевина.

Наявність обкладинки, що враховує регістри, дозволяє перетворити його на нечутливе до випадку, але не навпаки.


1

Це не термінал, це файлова система. Або у випадку cd(cd - вбудована оболонка) оболонки, тобто залежно від регістру.

Можна було б принаймні (принаймні, з ASCII) зробити так, що це нечутливе до регістру. Це складніше з уже використовуваним unicode (чи два символи однакові, може залежати від локального).

Що з цим робити

  • Живи з цим.
  • Спробуйте скористатися цими параметрами оболонки. Вони дають компроміс і полегшують роботу, не вводячи всіх проблем у нечутливість справи.
    • shopt -s nocaseglob # це в моєму ~/.bashrc
    • shopt -s nocasematch # це також буде в ~/.bashrc
    • set completion-ignore-case on # це в моєму ~/.inputrc

-2

В якості початкової точки, чому було задано це питання, і причиною, коли ви знайдете багато обговорень на ньому, якщо ви користуєтесь Google темою, полягає в тому, що чутливість випадків ускладнює "нормальним" людям вивчення та використання мови програмування чи командного рядка інтерфейс.

Чутливість кейсів бере початок у низькій потужності комп'ютерів у минулому. Щоб зробити речі нечутливими до речей, потрібна одна додаткова операція розбору до подачі команди інтерпретатору або компілятору до його виконання, і ранні конструктори не були готові витрачати сили комп'ютера на зручність чутливості регістру.

Я вважаю, що в коментарях, викладених вище, існує ряд неправильних тверджень. По-перше, психологи скажуть вам, що люди не автоматично розрізняють слово, написане великими та малими літерами, або навіть їх комбінацію за значенням слова. Кейс використовується в звичайних експресивних мовах для передачі додаткового значення. Наприклад, використання великої літери, яка починає слово у реченні, вказує, що це, швидше за все, власне іменник. Великі літери також використовуються для надання прозової структури. Наприклад, велика літера використовується для позначення початку речення. Але "Слово" і "Слово" розглядаються людським розумом як такі, що означають те саме.

Творці DOS, ADA та Pascal, якщо їх назвати декілька, оцінили, що чутливість до справи є додатковим навантаженням для початківців. Пізніше текстові редактори в "Інтегрованому середовищі розвитку" (IDE), розпізнаючи запасне слово, могли переробити це слово таким чином, щоб воно так чи інакше відповідало стилю; плюс відобразити його іншим кольором, щоб слово виділялося. Тож аргумент, що чутливість регістру робить для більш читабельного коду помилковим. Це не нормальним людям. Він просто додає зайвий і часом заплутаний шар до вже вимогливого завдання.

Java - крайній приклад дуже бідної мови з точки зору простоти використання початківцем. Він застосовує сувору чутливість до справ, але, по-дурному, дозволить програмісту мати дві функції, обидві з однаковим іменем, але які насправді різні функції в силу того, що один має різні аргументи для іншого. Дійсно, Java - це такий аборт мови, що, коли університети перейшли від викладання синтаксису Паскаля до студентів, проводячи курси некомп'ютерних наук, частота пропуску знизилася з приблизно 70% до 40%.

Отже, підсумовуючи, чутливість до справ виникала з двох причин. Одне було брак енергії комп’ютера. Друге - це те, що люди, які потрапляють у інформатику, часто знаходяться на аутистичному спектрі і не дуже добре ставляться до потреб "нормальних" людей. Як наслідок, ці люди не можуть оцінити, що чутливість до справ є як непотрібною, так і перешкодою для вивчення та використання мови програмування.


1
Я б видалив розділ на Java, тому що він є, імхо, заснований на думці, і крім пункту (перевантаження методу мало пов'язане з чутливістю до регістру) ... перевантаження методу / функції знайдеться і в інших мовах, таких як C ++ і pl / sql, щоб назвати, але два. Що стосується вашого абзацу з психології, я думаю, що джерела були б непоганими ... Нарешті, останній абзац є, так само, на основі думки і образливим, і його слід вилучити.
thecarpy

Щоб краще зрозуміти, чому C та всі мови, які були породжені з нього, заподіяли шкоду причині інформатики, будь ласка, перейдіть на сторінку; linkedin.com/pulse/… Ядро цієї проблеми, або я повинен сказати, ядро ​​:-), полягає в тому, що програмісти мають особистісний тип, який не переймається поширенням знань, а питанням роботи. Якщо ви не згодні з тим, що було сказано в цій публікації, будь ласка, викладіть аргумент, щоб обґрунтувати свої позиції. Думки мало рахуються.
Кевін Лофрі

Я погоджуюся, що чутливість до випадків ускладнює навчання. Але зауважте, що майже все в Unix є малі, тому зберігайте це таким чином. Основним винятком є ​​змінні середовища - це звичайно всі столиці.
ctrl-alt-delor

Випадок слід використовувати послідовно , і, як сказано в цій відповіді, для передачі додаткової інформації, наприклад, змінної середовища та звичайної змінної оболонки.
ctrl-alt-delor

-3

Чутливість до справ - це дурна ідея, яка виникла через те, що письменники Unix не розуміли, що ASCII створений таким чином, щоб він був нечутливим до регістру. Один просто ігнорує провідні біти. Ascii - це 7-бітове кодування з великим кодом A з десятковою величиною 65 1000001 і десятковою десятковою 97 1100001. з літерами, що йдуть в алфавітному порядку. Це створило всілякі ідеї, такі як усі клавіші в парах ключових значень, повинні бути числовими, щоб уникнути того, як тапочки відрізняються від тапочок. База даних Pick Multi-Value усвідомила це з самого початку і не враховує регістр.


2
"Дурний" - це ваша думка. У цій відповіді дуже мало фактичних даних, які я бачу. О, і навіщо обмежувати себе ASCII. Був і EBCDIC.
roaima
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.