Dlaczego w terminalu rozróżniana jest wielkość liter?

13

Kiedy to robię - CD ..zamiast cd ..
tego daje mi błąd mówiąc -

CD: command not found

Dlaczego w terminalach rozróżniana jest wielkość liter, jeśli chodzi o polecenia systemu Linux? Mam na myśli, że powinieneś być w stanie wykonać polecenie albo ze znakami „wszystkie wielkie litery” albo „wszystkie małe litery”.

Wiem, że to z jakiegoś powodu, ale jestem po prostu ciekawy.

Hussain Tamboli
źródło
9
Wydaje mi się, że to pytanie powinno zostać zmienione. Dlaczego w rozróżnianiu wielkości liter ma znaczenie?
kojiro
15
„Mam na myśli, że powinieneś być w stanie wykonać polecenie albo przy pomocy„ wszystkich wielkich ”, albo„ wszystkich małych ”. Naprawdę? Dlaczego?
dmckee --- były moderator kociak
5
Wydawaj a, stty iuclc olcucjeśli masz ochotę na terminal bez rozróżniania wielkości liter ;-)
Stéphane Chazelas,
1
CapsLock + c + d + CapsLock jest gorszy niż c + d
UniversallyUniqueID

Odpowiedzi:

43

Ostatecznie był to arbitralny wybór dokonany przez twórców Uniksa ponad cztery dekady temu. Mogliby zdecydować się na to, aby rzeczy nie rozróżniały wielkości liter, tak jak zrobili to twórcy MS-DOS dziesięć lat później, ale ma to również swoje wady.

Jest zbyt głęboko osadzony w kulturze * ix, aby można go teraz zmienić. Wielkość liter system plików problem wychowany przez eppesuig jest tylko częścią. Systemy macOS - które są oparte na Uniksie - zazwyczaj mają systemy plików bez rozróżniania wielkości liter (ale z zachowaniem wielkości liter), więc w takich systemach polecenia zewnętrzne względem powłoki są w rzeczywistości traktowane bez rozróżniania wielkości liter. Ale wbudowanecd , takie jak , rozróżniają małe i wielkie litery.

Nawet w przypadku systemu plików bez rozróżniania wielkości liter historia rzeczy spisuje się wbrew twoim życzeniom, Hussain. Gdy piszę lsna komputerze Mac, otrzymuję pokolorowaną listę katalogów. Jeśli LSzamiast tego piszę , /bin/lsnadal działa, ale wpis nie jest pokolorowany, ponieważ w aliasie dodającym -Cflagę rozróżniana jest wielkość liter.

Najlepiej przyzwyczaj się do tego. Jeśli możesz, naucz się go lubić.

Warren Young
źródło
1
W nazwach plików systemu Windows rozróżniana jest wielkość liter. Są na przykład w podsystemie POSIX i zobacz msdn.microsoft.com/en-us/library/ee681827%28v=vs.85%29.aspx
fpmurphy
3
To naprawdę zaskakujące, ponieważ niektóre popularne terminale dostępne w tym czasie były pisane tylko dużymi literami i musiały zaimplementować obejście (wstawić odwrotny ukośnik przed literą, jeśli chcesz, aby była naprawdę wielka - włączone, jeśli wpisałeś swoją nazwę użytkownika wielkimi literami podczas logowania in) w linii kierowca dyscypliny.
Random832
8

To nie jest problem z terminalem, to funkcja systemu plików. Jak powłoka powinna szukać poleceń w systemie plików (zawsze rozróżniającym wielkość liter)?

eppesuig
źródło
A co, jeśli dwa lub więcej poleceń są zgodne?
scai
1
Jedyną opcją, która może ci trochę pomóc, jest bashopcja o nazwie cdspell: próbuje znaleźć poprawną nazwę pliku, nawet jeśli źle go podałeś, ale działa tylko dla argumentów poleceń .
eppesuig
1
@HussainTamboli Może być polecenia o nazwie cd, CD, cDa Cdkażdy z unikalnym zachowanie.
scai
6
To tak naprawdę nie jest funkcja systemu plików ani funkcja terminalu - to funkcja powłoki. Wbudowane powłoki będą rozróżniać wielkość liter w systemie plików bez rozróżniania wielkości liter. Ponadto większość poleceń skrótu powłoki, więc polecenia nigdy tak naprawdę nie są plikami, w rzeczywistości są pobierane z skrótu. Spróbuj, hash -p /bin/hostname HOSTNAMEa teraz HOSTNAMEjest polecenie dla /bin/hostname.
kojiro
2
Och, powinienem również wspomnieć, że większość powłok ma mniejszą wielkość liter. W przypadku bash możesz powiązać set completion-ignore-case on.
kojiro
6

W systemach technicznych, których używam i które szanuję, rozróżniana jest niemal wyłącznie wielkość liter: system operacyjny, język programowania lub cokolwiek innego.

Wyjątkami, o których teraz mogłem pomyśleć, są tagi HTML i niektóre implementacje SQL oraz język programowania Ada.

Nawet w tych przypadkach myślę, że istnieją silne tendencje do pisania znaczników HTML małymi literami, a semantyka zapytań SQL dużymi literami (i wielkie litery parametrów). (Popraw mnie, jeśli się mylę.) Jeśli chodzi o Adę, tryb Emacsa poprawi cię, jeśli na przykład wpiszesz nazwę procedury małymi literami, chociaż nie będzie to miało znaczenia podczas kompilacji. Tak więc nawet w przypadku braku rozróżniania wielkości liter wydaje się, że ludzie zgadzają się, że to zły pomysł.

Powodem jest to, że zyskujesz znacznie większą moc ekspresji z rozróżnianiem wielkości liter. Nie tylko ilościowo - CDto jedno, ale CD, Cd, cD, a cdcztery - ale, co ważniejsze, można wyrazić cel, nacisk itp użyciu małych oraz wielkich sensownie; podczas programowania zwiększysz czytelność.

Intuicyjnie jasne jest, że nie czytasz hii w HIten sam sposób!

Ale, aby dać przykład świata komputerowego, w języku programowania Ada (z lat 80.) pierwszy wiersz bloku kodu procedury może wyglądać następująco:

procedure body P(SCB : in out Semaphore_Control_Block) is

jak widać, nazwy procedur i parametrów są pisane wielkimi literami, podobnie jak typy danych, wszystko inne jest pisane małymi literami. Zauważ też, że nazwa parametru „wielkie litery” mówi nam, że jest to akronim. Teraz porównaj to

procedure body p(scb : in out semaphore_control_block) is

Jest to możliwe, ponieważ Ada nie rozróżnia wielkich i małych liter (lub, mówiąc ściślej, kompilator zmieni to na sposób z mojego pierwszego przykładu, ale oczywiście nie zmieni twojego kodu). A może:

PROCedure body P(Scb : IN Out semaphore_CONTROL_BLOCK) iS

Ten jest nieco niedorzeczny, wiem; ale ktoś byłby na tyle głupi, żeby tak to napisać (no może nie). Chodzi o to, że system rozróżniania wielkości liter nie tylko zmusi ludzi do zachowania spójności, ale również im pomoże (czytelność) i wykorzysta go na swoją korzyść (powyższy przykład akronimu).

Emanuel Berg
źródło
2
Pascal i Delphi również nie uwzględniają wielkości liter. Również posiadanie na przykład dwóch zmiennych lengthi Lengthzwykle jest złym pomysłem :)
Ajasja
@Ajasja: To interesujące, ponieważ Ada jest bardzo podobna do Pascala. Cóż, myślę, że jeśli policzysz je wszystkie, byłoby ich mnóstwo, ponieważ jest tak wiele języków programowania. Co do długości, oczywiście - ale możesz pomyśleć o pewnym takim przypadku: co z Maxem (osobą) i maxem (funkcja, która pobiera listę rzeczywistych i zwraca największą)?
Emanuel Berg
Jeśli chodzi o twój ostatni przykład, możesz być zainteresowany tym, że interpreter SuperBasic QL pisał dużymi literami w dokładnie taki sposób: DEFine PROCedure Hellona przykład. Wystarczyło wpisać tylko wielkie litery, ale pełne słowo pojawiło się na listach programów. Dotyczyło to REMarkrównież i nie było denerwujące ...
David Biorąc pod uwagę
4

Nie jest to mniej lub bardziej dziwne niż to, że na początek mamy duże i małe litery alfabetu. Jeśli /usr/binzajrzysz do środka, zauważysz (bardzo) kilka plików wykonywalnych wykorzystujących wielkie litery.

Przestrzeń nazw, w której rozróżniana jest wielkość liter, jest nie tylko dwa razy większa niż przestrzeń niewrażliwa - różnica rośnie wykładniczo wraz z długością słowa. Na przykład, używając 26 znaków, istnieje 26 ^ 3 (17576) różnych możliwości w trzech literach; użycie 52 (2 * 26) znaków to 52 ^ 3 = 140608. Otwarta przestrzeń nazw to dobra rzecz;)

Złotowłosa
źródło
Skąd masz 3?
ctrl-alt-delor
@ ctrl-alt-delor To tylko przykład: „istnieje 26 ^ 3 (17576) różnych możliwości trzema literami ”.
goldilocks,
2

Pojęcie „wielka / mała” litera może być (i jest) rzeczą specyficzną dla ustawień regionalnych, która, podobnie jak każda inna komplikacja projektowa, powinna być przesunięta tak blisko punktu użycia, jak to możliwe na stosie aplikacji, nie może być częścią rdzeń.

Posiadanie środowiska uwzględniającego wielkość liter pozwala na zawinięcie go w środowisko bez rozróżniania wielkości liter, ale nie na odwrót.

Bobah
źródło
1

To nie jest terminal, to system plików. Lub w przypadku cd(cd jest wbudowaną powłoką) powłoki, która rozróżnia małe i wielkie litery.

Mogło to być możliwe (przynajmniej z ASCII), aby rozróżnić wielkość liter. Jest to trudniejsze w przypadku obecnie używanego Unicode (to, czy dwa znaki są takie same, może zależeć od lokalnego).

Co z tym zrobić

  • Żyj z tym.
  • Wypróbuj te opcje powłoki. Dają kompromis i ułatwiają, nie wprowadzając wszystkich problemów związanych z niewrażliwością na wielkość liter.
    • shopt -s nocaseglob # to jest w moim ~/.bashrc
    • shopt -s nocasematch # to też będzie ~/.bashrc
    • set completion-ignore-case on # to jest w moim ~/.inputrc
ctrl-alt-delor
źródło
-2

Jako punkt wyjścia powodem, dla którego zadano to pytanie, i jeśli znajdziesz dużo dyskusji na ten temat w Google, jest to, że rozróżnianie wielkości liter utrudnia „normalnym” ludziom naukę i używanie języka programowania lub wiersza poleceń berło.

Wrażliwość na wielkość liter ma swoje źródło w niskiej mocy komputerów w przeszłości. Aby rozróżnić wielkość liter, potrzebna była jedna dodatkowa operacja analizy przed przekazaniem polecenia do interpretera lub kompilatora przed jego wykonaniem, a wcześni projektanci nie byli przygotowani do marnowania mocy komputera dla wygody rozróżniania wielkości liter.

Uważam, że w powyższych komentarzach jest wiele niepoprawnych stwierdzeń. Po pierwsze, psychologowie powiedzą ci, że ludzie nie rozróżniają automatycznie słowa zapisanego wielkimi lub małymi literami, a nawet kombinacji obu pod względem znaczenia tego słowa. Case jest używany w normalnych językach ekspresyjnych, aby przekazać dodatkowe znaczenie. Na przykład użycie dużej litery rozpoczynającej słowo w zdaniu oznacza, że ​​jest to prawdopodobnie rzeczownik właściwy. Wielkie litery są również używane do nadania struktury prozy. Na przykład duża litera służy do wskazania początku zdania. Ale „Słowo” i „słowo” są postrzegane przez ludzki umysł jako mające to samo znaczenie.

Twórcy DOS, ADA i Pascal, żeby wymienić tylko kilka, docenili, że rozróżnianie wielkości liter stanowi dodatkowe obciążenie dla początkującego. Później redaktorzy tekstowi w „Zintegrowanych środowiskach programistycznych” (IDE), rozpoznając słowo rezerwowe, mogli przekształcić to słowo tak, aby i tak było zgodne ze stylem; oraz wyświetlaj go w innym kolorze, aby wyróżnić słowo. Argument, że rozróżnianie wielkości liter sprawia, że ​​kod jest bardziej czytelny, jest błędny. Nie „normalnym” ludziom. Po prostu dodaje niepotrzebną i czasem mylącą warstwę do już wymagającego zadania.

Java jest skrajnym przykładem bardzo słabego języka z punktu widzenia łatwości użytkowania przez początkującego. Wymusza ścisłą rozróżnianie wielkości liter, ale głupio pozwoli programiście mieć dwie funkcje, obie o tej samej nazwie, ale które tak naprawdę są różnymi funkcjami, ponieważ jeden ma inny zestaw argumentów niż drugi. Rzeczywiście, Java jest tak dużą aborcją języka, że ​​kiedy uniwersytety przestawiły się z nauczania składni Pascala na studentów, biorąc udział w kursach nieinformatycznych, wskaźnik zdawalności spadł z około 70% do 40%.

Podsumowując, rozróżnianie wielkości liter pojawiło się z dwóch powodów. Jednym z nich był brak mocy komputera. Po drugie, ludzie, którzy trafiają do informatyki, często znajdują się w spektrum autystycznym i nie odnoszą się dobrze do potrzeb „normalnych” ludzi. W związku z tym osoby te nie mogą docenić faktu, że rozróżnianie wielkości liter jest zarówno niepotrzebne, jak i utrudnia naukę i używanie języka programowania.

Kevin Loughrey
źródło
1
Chciałbym usunąć sekcję dotyczącą Javy, ponieważ jest ona oparta na opiniach i poza tym (przeciążenie metody ma niewiele wspólnego z rozróżnianiem wielkości liter) ... przeciążenie metody / funkcji występuje również w innych językach, takich jak C ++ i pl / sql, żeby wymienić tylko dwa. Co do twojego paragrafu psychologicznego, myślę, że źródła byłyby fajne ... Wreszcie ostatni akapit, również, oparty na opiniach i obraźliwy, powinien zostać usunięty.
thecarpy
Aby lepiej zrozumieć, dlaczego C i wszystkie języki, które się z niego odrodzili, wyrządziły szkody w informatyce, przejdź do; linkedin.com/pulse/… Sednem tego problemu, a może powinienem powiedzieć kernela :-), jest to, że programiści są typem osobowości nie zajmującej się rozpowszechnianiem wiedzy, ale wykonaniem pracy. Jeśli nie zgadzasz się z tym, co zostało powiedziane w tym poście, przedstaw argument, aby uzasadnić swoje stanowisko. Opinie liczą się niewiele.
Kevin Loughrey
Zgadzam się, że rozróżnianie wielkości liter utrudnia naukę. Ale zauważ, że prawie wszystko w Uniksie jest pisane małymi literami, więc zachowaj to w ten sposób. Głównym wyjątkiem jest to, że zmienne środowiskowe są tradycyjnie wszystkimi wielkimi literami.
ctrl-alt-delor
Sprawa powinna być używana konsekwentnie i jak powiedziano w tej odpowiedzi, aby przekazać dodatkowe informacje, np. Zmienna środowiskowa vs. normalna zmienna powłoki.
ctrl-alt-delor
-3

Rozróżnianie wielkości liter to głupi pomysł, który powstał, ponieważ autorzy uniksowi nie rozumieli, że ASCII jest zaprojektowany tak, aby łatwo rozróżniać wielkość liter. Jeden po prostu ignoruje wiodące bity. Ascii to 7-bitowe kodowanie z wielką literą A o wartości bitowej dziesiętnej 65 1000001 i bitowej dziesiętnej 97 1100001. z literami alfabetycznymi. To wygenerowało różnego rodzaju pomysły, takie jak wszystkie klucze w parach klucz-wartość powinny być numeryczne, aby uniknąć, że Pantofle różnią się od pantofli. Baza danych Pick Multi-Value zrealizowała to od samego początku i nie rozróżnia wielkości liter.

ArgoPete
źródło
2
„Głupie” to twoja opinia. W tej odpowiedzi niewiele jest faktów. Aha i dlaczego ograniczać się do ASCII. Był też EBCDIC.
roaima