Warum unterscheidet das Terminal zwischen Groß- und Kleinschreibung?

12

Wenn ich das tue - CD ..anstatt cd ..
es gibt mir Fehler zu sagen -

CD: command not found

Warum unterscheidet das Terminal zwischen Groß- und Kleinschreibung, wenn es um Linux-Befehle geht? Ich meine, Sie sollten in der Lage sein, den Befehl entweder mit "nur Großbuchstaben" oder "nur Kleinbuchstaben" auszuführen.

Ich weiß, dass es einen Grund gibt, aber ich bin nur neugierig.

Hussain Tamboli
quelle
9
Ich habe fast das Gefühl, dass diese Frage umbenannt werden sollte. Warum wird zwischen Groß- und Kleinschreibung unterschieden?
Kojiro
15
"Ich meine, Sie sollten in der Lage sein, den Befehl entweder mit" nur Großbuchstaben "oder" nur Kleinbuchstaben "auszuführen." "Ja wirklich?" Warum?
dmckee --- Ex-Moderator Kätzchen
5
Geben Sie ein aus, stty iuclc olcucwenn Sie ein Terminal haben möchten, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird ;-)
Stéphane Chazelas
1
CapsLock + c + d + CapsLock ist schlimmer als c + d
UniversallyUniqueID

Antworten:

43

Letztendlich war es eine willkürliche Entscheidung, die die Entwickler von Unix vor über vier Jahrzehnten getroffen haben. Sie hätten sich dafür entscheiden können, die Groß- und Kleinschreibung zu ignorieren, wie dies die Entwickler von MS-DOS ein Jahrzehnt später getan haben, aber das hat auch seine Nachteile.

Es ist zu tief in die * ix-Kultur eingebettet, als dass es sich jetzt ändern könnte. Das von eppesuig angesprochene Problem der Groß- und Kleinschreibung des Dateisystems ist nur ein Teil davon. MacOS-Systeme - die auf Unix basieren - haben normalerweise Dateisysteme, bei denen die Groß- / Kleinschreibung nicht berücksichtigt wird (aber die Groß- / Kleinschreibung beibehalten wird). In solchen Systemen werden Befehle, die sich außerhalb der Shell befinden, tatsächlich unabhängig von der Groß- / Kleinschreibung behandelt. Bei eingebauten Funktionen wird jedochcd weiterhin die Groß- und Kleinschreibung berücksichtigt .

Selbst mit einem Dateisystem, bei dem die Groß- und Kleinschreibung keine Rolle spielt, widerspricht die Geschichte Ihren Wünschen, Hussain. Wenn ich lsauf meinem Mac tippe, erhalte ich eine farbige Verzeichnisliste. Wenn ich LSstattdessen /bin/lstippe , wird es weiterhin ausgeführt, aber die Auflistung wird nicht eingefärbt, da bei dem Alias, der das -CFlag hinzufügt, die Groß- und Kleinschreibung beachtet wird.

Am besten gewöhnen Sie sich einfach daran. Wenn du kannst, lerne es zu mögen.

Warren Young
quelle
1
Bei Windows-Dateinamen kann die Groß- und Kleinschreibung beachtet werden. Sie befinden sich beispielsweise im POSIX-Subsystem und finden Sie unter msdn.microsoft.com/en-us/library/ee681827%28v=vs.85%29.aspx
fpmurphy am
3
Es ist tatsächlich überraschend, dass einige gängige Terminals zu dieser Zeit nur in Großbuchstaben verfügbar waren und eine Problemumgehung implementieren mussten (setzen Sie einen Backslash vor einen Buchstaben, wenn es wirklich in Großbuchstaben geschrieben werden soll - aktiviert, wenn Sie Ihren Benutzernamen bei der Anmeldung in Großbuchstaben eingegeben haben in) im Liniendisziplin-Fahrer.
Random832
8

Dies ist kein "Terminal" -Problem, sondern eine Dateisystemfunktion. Wie soll die Shell nach Ihren Befehlen im Dateisystem (immer Groß- und Kleinschreibung beachten) suchen?

eppesuig
quelle
Und was ist, wenn zwei oder mehr Befehle übereinstimmen?
Scai
1
Die einzige Option , die Ihnen ein wenig helfen kann , ist eine bashOption genannt cdspell: es versucht , die richtigen Dateinamen zu finden , auch wenn Sie es falsch tiped, aber es ist nur für den Befehl Arbeits Argumente .
Eppesuig
1
@HussainTamboli Es könnten Befehle genannt werden cd, CD, cDund Cdjedes mit einem einzigartigen Verhalten.
Scai
6
Es handelt sich nicht wirklich um ein Dateisystem- oder Terminal-Feature, sondern um ein Shell-Feature. Shell-Builtins unterscheiden bei einem Dateisystem, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, zwischen Groß- und Kleinschreibung. Die meisten Shell-Hash-Befehle sind also nie wirklich Dateien, sondern stammen aus einem Hash. Probieren Sie hash -p /bin/hostname HOSTNAMEund jetzt HOSTNAMEist der Befehl für /bin/hostname.
Kojiro
2
Oh, ich sollte auch erwähnen, dass man bei den meisten Shells die Groß- und Kleinschreibung vernachlässigen kann. Für Bash können Sie binden set completion-ignore-case on.
Kojiro
6

Bei den technischen Systemen, die ich verwende und respektiere, wird fast ausschließlich zwischen Groß- und Kleinschreibung unterschieden: Sei es das Betriebssystem oder die Programmiersprache oder irgendetwas anderes.

Die Ausnahmen, an die ich im Moment denken könnte, sind die HTML-Tags und einige Implementierungen von SQL sowie die Programmiersprache Ada.

Selbst in diesen Fällen gibt es meiner Meinung nach starke Tendenzen, HTML-Tags in Kleinbuchstaben und die SQL-Abfragesemantik in Großbuchstaben (und in Großbuchstaben) zu schreiben. (Korrigieren Sie mich, wenn ich falsch liege.) Wie bei Ada korrigiert Sie der Emacs-Modus, wenn Sie beispielsweise einen Prozedurnamen in Kleinbuchstaben eingeben, obwohl dies beim Kompilieren keine Rolle spielt. Selbst wenn die Groß- und Kleinschreibung nicht berücksichtigt wird, scheinen die Leute zuzustimmen, dass dies eine schlechte Idee ist.

Der Grund dafür ist, dass Sie mit Groß- und Kleinschreibung viel mehr Ausdruckskraft erhalten. Nicht nur quantitativ - CDist eine, sondern CD, Cd, cD, und cdvier sind - aber noch wichtiger ist , können Sie äußern Zweck, Betonung usw. mit Groß- und Klein vernünftig; Außerdem verbessern Sie beim Programmieren die Lesbarkeit.

Intuitiv ist klar , dass Sie nicht lesen hiund HIdie gleiche Art und Weise!

Um Ihnen ein Computerweltbeispiel zu geben: In der Programmiersprache Ada (aus den 1980er Jahren) könnte die erste Zeile eines Prozedurcodeblocks folgendermaßen aussehen:

procedure body P(SCB : in out Semaphore_Control_Block) is

Wie Sie sehen, werden die Prozedur- und Parameternamen in Großbuchstaben geschrieben, ebenso wie Datentypen. Alles andere ist in Kleinbuchstaben geschrieben. Beachten Sie auch, dass der Parametername "in Großbuchstaben" besagt, dass es sich um ein Akronym handelt. Vergleichen Sie dies nun mit

procedure body p(scb : in out semaphore_control_block) is

Dies ist möglich, da Ada die Groß- und Kleinschreibung nicht berücksichtigt (oder, um genau zu sein, der Compiler ändert es wie in meinem ersten Beispiel, ändert aber natürlich nicht Ihren Code). Oder wie wäre es mit:

PROCedure body P(Scb : IN Out semaphore_CONTROL_BLOCK) iS

Das ist ein bisschen lächerlich, ich weiß; aber jemand wäre dumm genug, es so zu schreiben (na ja, vielleicht auch nicht). Es ist wichtig, dass ein case sensitive System nicht nur die Konsistenz der Menschen erzwingt, sondern auch dazu beiträgt (Lesbarkeit) und sie zu ihrem Vorteil nutzt (das Akronym-Beispiel oben).

Emanuel Berg
quelle
2
Pascal und Delphi berücksichtigen die Groß- und Kleinschreibung nicht. Auch zum Beispiel zwei Variablen lengthund Lengthist in der Regel eine schlechte Idee :)
Ajasja
@ Ajasja: Das ist interessant, weil Ada Pascal sehr ähnlich ist. Nun, ich denke, wenn Sie alle gezählt hätten, gäbe es Unmengen solcher Sprachen, weil es so viele Programmiersprachen gibt. Natürlich in Bezug auf die Länge - aber Sie könnten sich möglicherweise einen solchen Fall vorstellen: Was ist mit Max (einer Person) und max (einer Funktion, die eine Liste von Reals aufnimmt und die größte zurückgibt)?
Emanuel Berg
In Bezug auf Ihr letztes Beispiel könnte es Sie interessieren, dass der SuperBasic-Interpreter des QL Schlüsselwörter genau so groß geschrieben hat: DEFine PROCedure HelloZum Beispiel. Sie hatte nur geben die aktivierten Bits, aber das volle Wort in Programmlisten erschienen. Dies galt REMarkauch und war nicht so nervig ...
David Given
4

Es ist nicht mehr oder weniger seltsam als die Tatsache, dass wir zunächst ein Alphabet in Groß- und Kleinschreibung haben. Wenn Sie nachschauen /usr/bin, werden Sie feststellen, dass (sehr) wenige ausführbare Dateien die Groß- und Kleinschreibung ausnutzen.

Ein Namespace, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, ist nicht nur doppelt so groß wie ein unempfindlicher Namespace - der Unterschied wächst exponentiell mit der Wortlänge. ZB gibt es mit 26 Zeichen 26 ^ 3 (17576) verschiedene Möglichkeiten in drei Buchstaben; mit 52 (2 * 26) Zeichen gibt es 52 ^ 3 = 140608. Ein offener Namespace ist eine gute Sache;)

Goldlöckchen
quelle
Woher hast du die 3?
Strg-Alt-Delor
@ ctrl-alt-delor Es ist nur ein Beispiel: "Es gibt 26 ^ 3 (17576) verschiedene Möglichkeiten in drei Buchstaben ".
Goldlöckchen
2

Das Konzept der "Groß- / Kleinschreibung" kann (und ist in der Tat) eine länderspezifische Sache sein, die, wie jede andere Designkomplikation, so nahe wie möglich an den Verwendungspunkt im Anwendungsstapel gebracht werden sollte, nicht Teil der Ader.

In einer Umgebung, in der zwischen Groß- und Kleinschreibung unterschieden wird, kann diese in eine Umgebung ohne Berücksichtigung der Groß- und Kleinschreibung eingebunden werden, jedoch nicht umgekehrt.

Bobah
quelle
1

Es ist nicht das Terminal, es ist das Dateisystem. Oder bei cd(cd ist eine eingebaute Shell) der Shell ist die Groß- und Kleinschreibung zu beachten.

Es hätte möglich sein können (zumindest mit ASCII), die Groß- und Kleinschreibung zu ignorieren. Dies ist schwieriger mit dem jetzt verwendeten Unicode (ob zwei Zeichen gleich sind, kann von local abhängen).

Was tun?

  • Lebe damit.
  • Probieren Sie diese Shell-Optionen aus. Sie geben einen Kompromiss vor und erleichtern die Arbeit, ohne alle Probleme der Unterscheidung zwischen Groß- und Kleinschreibung zu berücksichtigen.
    • shopt -s nocaseglob #das ist in meinem ~/.bashrc
    • shopt -s nocasematch Dies wäre auch in ~/.bashrc
    • set completion-ignore-case on #das ist in meinem ~/.inputrc
Strg-Alt-Delor
quelle
-2

Der Grund, warum diese Frage gestellt wurde, und der Grund, warum Sie viel darüber diskutieren werden, wenn Sie das Thema googeln, ist, dass es für "normale" Leute schwieriger ist, eine Programmiersprache oder Befehlszeile zu lernen und zu verwenden Schnittstelle.

Die Unterscheidung zwischen Groß- und Kleinschreibung hat ihren Ursprung in der geringen Leistung von Computern in der Vergangenheit. Um die Groß- und Kleinschreibung zu ignorieren, war eine zusätzliche Parsing-Operation erforderlich, bevor der Befehl dem Interpreter oder einem Compiler vor seiner Ausführung übergeben wurde. Frühere Entwickler waren nicht bereit, die Leistung des Computers für die Groß- und Kleinschreibung zu verschwenden.

Ich glaube, in den obigen Kommentaren gibt es eine Reihe von falschen Behauptungen. Erstens werden Psychologen Ihnen sagen, dass Menschen nicht automatisch zwischen einem Wort in Groß- oder Kleinbuchstaben oder sogar einer Kombination aus beiden in Bezug auf die Bedeutung des Wortes unterscheiden. Die Groß- und Kleinschreibung wird in normalen Ausdruckssprachen verwendet, um eine zusätzliche Bedeutung zu vermitteln. Die Verwendung eines Großbuchstabens, der ein Wort in einem Satz beginnt, zeigt beispielsweise an, dass es sich höchstwahrscheinlich um ein Eigenname handelt. Großbuchstaben werden auch verwendet, um die Prosa zu strukturieren. Beispielsweise wird ein Großbuchstabe verwendet, um den Anfang eines Satzes anzugeben. Aber "Wort" und "Wort" werden vom menschlichen Verstand als gleichbedeutend angesehen.

Die Macher von DOS, ADA und Pascal, um nur einige zu nennen, waren sich darüber im Klaren, dass die Berücksichtigung der Groß- und Kleinschreibung eine zusätzliche Belastung für den Anfänger darstellt. Später konnten Texteditoren in "Integrated Development Environments" (IDEs), die ein reserviertes Wort erkannten, dieses Wort so umformulieren, dass es ohnehin dem Stil entsprach. Zeigen Sie es außerdem in einer anderen Farbe an, um das Wort hervorzuheben. Das Argument, dass Groß- und Kleinschreibung für besser lesbaren Code sorgt, ist daher trügerisch. Es geht nicht um "normale" Leute. Es fügt einfach eine unnötige und manchmal verwirrende Ebene zu einer bereits anspruchsvollen Aufgabe hinzu.

Java ist ein extremes Beispiel für eine sehr schlechte Sprache im Hinblick auf die Benutzerfreundlichkeit für Anfänger. Es erzwingt die strikte Berücksichtigung der Groß- und Kleinschreibung, erlaubt dem Programmierer jedoch dummerweise, zwei Funktionen mit demselben Namen zu haben, die jedoch tatsächlich verschiedene Funktionen sind, da eine andere Argumente hat als die andere. Java ist in der Tat ein derartiger Sprachabbruch, dass sich die Erfolgsquote von rund 70% auf 40% verringerte, als die Universitäten von der Vermittlung von Pascal-Syntax zu Studenten wechselten, die nicht-Informatik-Kurse absolvierten.

Zusammenfassend ergab sich die Groß- / Kleinschreibung aus zwei Gründen. Einer war der Mangel an Computerleistung. Die zweite war, dass Menschen, die ihren Weg in die Informatik finden, oft im autistischen Spektrum liegen und sich nicht gut auf die Bedürfnisse "normaler" Menschen beziehen. Infolgedessen können diese Personen nicht einschätzen, dass die Berücksichtigung der Groß- und Kleinschreibung unnötig ist und das Erlernen und Verwenden einer Programmiersprache behindert.

Kevin Loughrey
quelle
Ich würde den Abschnitt über Java entfernen, da er meiner Meinung nach auf der Grundlage von Meinungen erstellt wurde und außerdem (Methodenüberladung hat wenig mit Groß- und Kleinschreibung zu tun) ... Methoden- / Funktionsüberladung gibt es auch in anderen Sprachen, wie z. B. C ++ und pl / sql um nur zwei zu nennen. Was deinen Psychologie-Absatz betrifft, denke ich, Quellen wären nett ... Schließlich ist der letzte Absatz imho auch meinungsbasiert und anstößig und sollte entfernt werden.
thecarpy
Um ein besseres Verständnis dafür zu erhalten, warum C und alle daraus hervorgegangenen Sprachen der Sache der Informatik Schaden zugefügt haben, wenden Sie sich an. linkedin.com/pulse/… Der Kern dieses Problems, oder sollte ich Kernel sagen :-), ist, dass Programmierer von einem Persönlichkeitstyp sind, der nicht daran interessiert ist, Wissen zu verbreiten, sondern einen Job zu erledigen. Wenn Sie mit dem, was in diesem Beitrag gesagt wurde, nicht einverstanden sind, begründen Sie bitte Ihre Position mit einem Argument. Meinungen zählen wenig.
Kevin Loughrey
Ich stimme zu, dass Groß- und Kleinschreibung das Lernen erschwert. Beachten Sie jedoch, dass in Unix fast alles in Kleinbuchstaben geschrieben ist. Eine Hauptausnahme ist, dass Umgebungsvariablen herkömmlicherweise alle Hauptstädte sind.
ctrl-alt-delor
Die Groß- / Kleinschreibung sollte konsistent verwendet werden und wie in dieser Antwort angegeben, um zusätzliche Informationen zu vermitteln, z. B. Umgebungsvariable gegenüber normaler Shell-Variable.
ctrl-alt-delor
-2

Groß- und Kleinschreibung ist eine dumme Idee, die entstanden ist, weil Unix-Autoren nicht verstanden haben, dass ASCII so konzipiert ist, dass Groß- und Kleinschreibung nicht berücksichtigt wird. Man ignoriert einfach die führenden Bits. ASCII ist eine 7-Bit-Codierung mit dem Großbuchstaben A bei einem Dezimalwert von 65 1000001 und einem Dezimalwert von 97 1100001. Die Buchstaben folgen alphabetisch. Dies führte zu allen möglichen Ideen, z. B. sollten alle Schlüssel in Schlüsselwertpaaren numerisch sein, um zu vermeiden, dass sich Hausschuhe von Hausschuhen unterscheiden. Die Multi-Value-Datenbank von Pick hat dies von Anfang an erkannt und unterscheidet nicht zwischen Groß- und Kleinschreibung.

ArgoPete
quelle
2
"Dumme" ist Ihre Meinung. Diese Antwort enthält sehr wenig Fakten, die ich sehen kann. Oh, und warum beschränken Sie sich auf ASCII. Es gab auch EBCDIC.
Roaima