Почему терминал чувствителен к регистру?

13

Когда я делаю - CD ..вместо cd ..
этого выдает ошибку, говоря -

CD: command not found

Почему терминал чувствителен к регистру , когда речь идет о командах Linux? Я имею в виду, что вы должны быть в состоянии выполнить команду, используя символы «все прописные» или «все строчные».

Я знаю, что это по какой-то причине, но мне просто любопытно.

Хуссейн Тамболи
источник
9
Я почти чувствую, что этот вопрос должен быть переименован. Почему все чувствительно к регистру?
Кодзиро
15
«Я имею в виду, что вы должны быть в состоянии выполнить команду, используя« все прописные »или« все строчные »символы». В самом деле? Почему?
dmckee --- котенок экс-модератора
5
Выпустите, stty iuclc olcucесли вы хотите иметь терминал без учета регистра ;-)
Стефан Шазелас
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
Это на самом деле удивительно, так как некоторые общие терминалы, доступные в то время, были только в верхнем регистре, и им приходилось применять обходной путь (ставьте обратную косую черту перед буквой, если вы хотите, чтобы она была действительно заглавной, - включали, если вы вводили свое имя пользователя во всех прописных буквах при входе в) в соответствии с дисциплиной водителя.
Random832
8

Это не проблема «терминала», это функция файловой системы. Как оболочка должна искать ваши команды в файловой системе (всегда с учетом регистра)?

eppesuig
источник
А что, если две или более команд совпадают?
Scai
1
Единственная опция, которая может вам немного помочь, - это bashопция, которая называется cdspell: она пытается найти правильное имя файла, даже если вы указали его неправильно, но работает только для аргументов команды .
eppesuig
1
@HussainTamboli Там могут быть команды с именем cd, CD, cDи Cdкаждый с уникальным поведением.
Scai
6
Это на самом деле не функция файловой системы или функция терминала - это функция оболочки. Встроенные оболочки будут чувствительны к регистру файловой системы без учета регистра. Кроме того, большинство оболочек хеш-команд, поэтому команды никогда не являются файлами, они на самом деле взяты из хеша. Попробуйте hash -p /bin/hostname HOSTNAMEи сейчас HOSTNAMEэто команда для /bin/hostname.
Кодзиро
2
О, я должен также упомянуть, что вы можете сказать большинству оболочек быть менее чувствительными к регистру. Для bash, вы можете связать set completion-ignore-case on.
Кодзиро
6

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

Исключения, о которых я мог подумать сейчас, - это теги HTML и некоторые реализации SQL, а также язык программирования Ada.

Даже в этих случаях, я думаю, существуют сильные тенденции к написанию HTML-тегов в нижнем регистре, а семантика SQL-запроса - в верхнем регистре (и параметры пишутся с большой буквы). (Поправьте меня, если я ошибаюсь.) Что касается Ada, режим 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

Это возможно, так как Ada нечувствительна к регистру (или, если быть точным, компилятор изменит его так, как в моем первом примере, но, конечно, не изменит ваш код). Или как насчет:

PROCedure body P(Scb : IN Out semaphore_CONTROL_BLOCK) iS

Это немного смешно, я знаю; но кто-то был бы достаточно глуп, чтобы написать это таким образом (ну, возможно, нет). Дело в том, что система, учитывающая регистр, не только заставит людей быть последовательными, но и поможет им (удобочитаемость) и использует ее в своих интересах (пример аббревиатуры выше).

Эмануэль Берг
источник
2
Паскаль и Delphi также не чувствительны к регистру. Кроме того, наличие, например, двух переменных 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) разных возможностей ».
Златовласка
2

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

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

BoBaH
источник
1

Это не терминал, это файловая система. Или в случае cd(cd - встроенная оболочка) оболочки, которая чувствительна к регистру.

Можно было бы (по крайней мере, с ASCII) сделать регистр без учета регистра. Это сложнее с используемым в настоящее время юникодом (одинаковые два символа могут зависеть от локального).

Что с этим делать

  • Живи с этим.
  • Попробуйте эти варианты оболочки. Они дают компромисс и упрощают работу, не представляя всех проблем нечувствительности к регистру.
    • shopt -s nocaseglob # это в моем ~/.bashrc
    • shopt -s nocasematch # это также будет в ~/.bashrc
    • set completion-ignore-case on # это в моем ~/.inputrc
Ctrl-Alt-Делор
источник
-2

В качестве отправной точки, причина, по которой этот вопрос был задан, и причина, по которой вы найдете много дискуссий по этому вопросу, если вы будете гуглить тему, заключается в том, что чувствительность к регистру затрудняет «нормальным» людям изучение и использование языка программирования или командной строки интерфейс.

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

Я считаю, что в комментариях, сделанных выше, есть ряд неверных утверждений. Во-первых, психологи скажут вам, что люди не делают различий между словом, написанным заглавными или строчными буквами, или даже комбинацией двух в терминах значения слова. Кейс используется в обычных выразительных языках, чтобы передать дополнительное значение. Например, использование заглавной буквы, начинающей слово в предложении, указывает, что это, скорее всего, собственное существительное. Заглавные буквы также используются, чтобы дать структуру прозы. Например, заглавная буква используется для обозначения начала предложения. Но «Слово» и «слово» рассматриваются человеческим разумом как означающие одно и то же.

Создатели DOS, ADA и Pascal, если назвать несколько, оценили, что чувствительность к регистру была дополнительным бременем для новичка. Позднее текстовые редакторы в «Интегрированных средах разработки» (IDE), распознавая резервное слово, могли переписать это слово так, чтобы оно в любом случае соответствовало стилю; Кроме того, отобразите его в другом цвете, чтобы выделить слово. Поэтому аргумент о том, что чувствительность к регистру делает код более читабельным, ошибочен. Это не для "нормальных" людей. Это просто добавляет ненужный и иногда запутанный слой к и без того сложной задаче.

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

Итак, в итоге, чувствительность к регистру возникла по двум причинам. Одним из них было отсутствие компьютерной мощности. Вторым было то, что люди, которые находят свой путь в информатику, часто относятся к аутистическому спектру и плохо относятся к потребностям «нормальных» людей. Как следствие, эти люди не могут понять, что чувствительность к регистру является и ненужной, и препятствием для изучения и использования языка программирования.

Кевин Лафрей
источник
1
Я бы удалил раздел о Java, потому что он, imho, основан на мнениях и, кроме того, имеет смысл (перегрузка метода имеет мало общего с чувствительностью к регистру) ... Перегрузка метода / функции встречается и в других языках, таких как C ++ и pl / sql, чтобы назвать, но два. Что касается вашего параграфа по психологии, я думаю, что источники были бы хорошими ... Наконец, последний параграф, imho, основан на мнениях, а также оскорбителен и должен быть удален.
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 осознала это с самого начала и не учитывает регистр.

ArgoPete
источник
2
«Глупо» - это ваше мнение. В этом ответе очень мало фактов, которые я вижу. Ох, и зачем ограничиваться ASCII. Был и EBCDIC.
Ройма