Perché il terminale fa distinzione tra maiuscole e minuscole?


12

Quando lo faccio, CD ..invece cd ..
mi dà un errore nel dire:

CD: command not found

Perché il terminale maiuscole e minuscole quando si tratta di comandi di Linux? Voglio dire che dovresti essere in grado di eseguire il comando con i caratteri "tutto maiuscolo" o "tutto minuscolo".

So che è dovuto a qualche motivo, ma sono solo curioso.


9
Sento quasi che questa domanda debba essere ribattezzata Perché le cose fanno distinzione tra maiuscole e minuscole?
Kojiro,

15
"Voglio dire che dovresti essere in grado di eseguire il comando con i caratteri" tutto maiuscolo "o" tutto minuscolo "." Veramente? Perché?
dmckee --- ex gattino moderatore

5
Emetti un stty iuclc olcucse hai voglia di avere un terminale senza distinzione tra maiuscole e minuscole ;-)
Stéphane Chazelas,

1
CapsLock + c + d + CapsLock è peggio di c + d
UniversallyUniqueID

Risposte:


43

In definitiva, è stata una scelta arbitraria fatta dai creatori di Unix oltre quattro decenni fa. Avrebbero potuto scegliere di rendere le cose senza distinzione tra maiuscole e minuscole come hanno fatto i creatori di MS-DOS dieci anni dopo, ma questo ha anche i suoi svantaggi.

È troppo profondamente radicato nella cultura * ix per cambiare adesso. Il problema del filesystem case sensitive sollevato da eppesuig è solo una parte di esso. i sistemi macOS - che sono basati su Unix - hanno tipicamente file system senza distinzione tra maiuscole e minuscole (ma che preservano la distinzione tra maiuscole e minuscole), quindi su tali sistemi i comandi esterni alla shell vengono infatti trattati senza distinzione tra maiuscole e minuscole. Ma i builtin comecd rimangono sensibili al maiuscolo / minuscolo.

Anche con un filesystem senza distinzione tra maiuscole e minuscole, la storia delle cose cospira contro i tuoi desideri, Hussain. Se scrivo lssul mio Mac, ottengo un elenco di directory colorato. Se LSinvece /bin/lsscrivo, viene comunque eseguito, ma l'elenco non viene colorato perché l'alias che aggiunge il -Cflag fa distinzione tra maiuscole e minuscole.

Meglio abituarsi. Se puoi, impara ad apprezzarlo.


1
In realtà i nomi di file di Windows possono fare distinzione tra maiuscole e minuscole. Sono nel sottosistema POSIX per esempio e vedere msdn.microsoft.com/en-us/library/ee681827%28v=vs.85%29.aspx
fpmurphy

3
In realtà è sorprendente poiché alcuni terminali comuni disponibili al momento erano solo in maiuscolo e dovevano implementare una soluzione alternativa (mettere una barra rovesciata prima di una lettera se si desidera che sia davvero maiuscolo - abilitato se si digita il nome utente in maiuscolo quando si è registrati in) nella linea disciplina driver.
Casuale 832

8

Questo non è un problema "terminale", è una funzione del file system. Come dovrebbe la shell cercare i tuoi comandi sul file system (sempre sensibile al maiuscolo / minuscolo)?


E se due o più comandi corrispondono?
scai,

1
L'unica opzione che può aiutarti un po 'è bashun'opzione chiamata cdspell: prova a trovare il nome file corretto anche se lo hai scritto in modo errato, ma funziona solo per argomenti di comando .
eppesuig,

1
@HussainTamboli Ci potrebbe essere chiamato comandi cd, CD, cDe Cdciascuno con un comportamento unico.
scai,

6
Non è in realtà una funzione di file system o una funzionalità di terminale: è una funzione di shell. I builtin della shell saranno sensibili al maiuscolo / minuscolo su un filesystem senza distinzione tra maiuscole e minuscole. Inoltre, la maggior parte dei comandi shell hash, per cui i comandi non sono mai realmente i file, sono in realtà tratte da un hash. Prova hash -p /bin/hostname HOSTNAMEe ora HOSTNAMEè il comando per /bin/hostname.
Kojiro,

2
Oh, dovrei anche menzionare che puoi dire alla maggior parte delle shell di essere meno sensibili al maiuscolo / minuscolo. Per bash, puoi legare set completion-ignore-case on.
Kojiro,

6

I sistemi tecnici che utilizzo e rispetto sono quasi esclusivamente sensibili al maiuscolo / minuscolo: che si tratti di SO o linguaggio di programmazione o qualsiasi altra cosa.

Le eccezioni che mi vengono in mente in questo momento sono i tag HTML e alcune implementazioni di SQL e il linguaggio di programmazione Ada.

Anche in questi casi, penso che ci siano forti tendenze a scrivere effettivamente tag HTML in minuscolo e la semantica della query SQL in maiuscolo (e i parametri in maiuscolo). (Correggimi se sbaglio.) Per quanto riguarda Ada, la modalità Emacs ti correggerà se, ad esempio, digiti un nome di procedura in minuscolo, anche se questo non ha importanza durante la compilazione. Quindi, anche in caso di insensibilità ai casi, sembra che le persone concordino sul fatto che sia una cattiva idea.

Il motivo è che ottieni molto più potere espressivo con la sensibilità al maiuscolo / minuscolo. Non solo quantitativamente - CDè uno, ma CD, Cd, cD, e cdsono quattro - ma ancora più importante, è possibile esprimere scopo, l'accento, ecc utilizzando maiuscole e minuscole sensibilmente; inoltre, durante la programmazione, migliorerai la leggibilità.

Intuitivamente, è chiaro che non leggi hie HIallo stesso modo!

Ma, per darvi un esempio nel mondo dei computer, nel linguaggio di programmazione Ada (dagli anni '80), la prima riga di un blocco di codice di procedura potrebbe apparire così:

procedure body P(SCB : in out Semaphore_Control_Block) is

come vedi, i nomi delle procedure e dei parametri sono in maiuscolo, così come i tipi di dati, tutto il resto è in minuscolo. Si noti inoltre che il nome del parametro "tutto maiuscolo" ci dice che è un acronimo. Ora, confronta questo con

procedure body p(scb : in out semaphore_control_block) is

Questo è possibile, poiché Ada non fa distinzione tra maiuscole e minuscole (o, per essere esatti, il compilatore lo cambierà come nel mio primo esempio, ma ovviamente non cambierà il tuo codice). Oppure, che ne dici di:

PROCedure body P(Scb : IN Out semaphore_CONTROL_BLOCK) iS

Quello è un po 'ridicolo, lo so; ma qualcuno sarebbe abbastanza stupido da scriverlo in quel modo (beh, forse no). Il punto è che un sistema case sensitive non solo costringerà le persone a essere coerenti, ma saranno anche aiutate da esso (leggibilità) e lo useranno a loro vantaggio (l'esempio di acronimo sopra).


2
Pascal e Delphi non fanno distinzione tra maiuscole e minuscole. Inoltre, avendo ad esempio due variabili lengthed Lengthè generalmente una cattiva idea :)
Ajasja

@Ajasja: È interessante, perché Ada è molto simile a Pascal. Beh, immagino che se li contassi tutti, ci sarebbero tonnellate di tali linguaggi, perché ci sono così tanti linguaggi di programmazione. Per quanto riguarda la lunghezza, ovviamente - ma potresti pensare a un caso del genere: che dire di Max (una persona) e max (una funzione che prende un elenco di reali e restituisce il più grande)?
Emanuel Berg

Per quanto riguarda il tuo ultimo esempio, potresti essere interessato a sapere che l'interprete SuperBasic di QL ha capitalizzato le parole chiave esattamente in questo modo: DEFine PROCedure Helload esempio. Devi solo digitare i bit in maiuscolo, ma la parola completa appare negli elenchi dei programmi. Questo valeva REMarkanche per, e non era così fastidioso ...
David Dato

4

Non è più o meno strano del fatto che abbiamo un alfabeto maiuscolo e minuscolo per cominciare. Se guardi dentro /usr/bin, noterai alcuni (molto) eseguibili che sfruttano la capitalizzazione.

Uno spazio dei nomi con distinzione tra maiuscole e minuscole non è solo il doppio di uno insensibile: la differenza aumenta esponenzialmente con la lunghezza delle parole. Ad esempio, usando 26 caratteri, ci sono 26 ^ 3 (17576) possibilità diverse in tre lettere; usando 52 (2 * 26) caratteri ci sono 52 ^ 3 = 140608. Uno spazio dei nomi aperto è una buona cosa;)


Da dove hai preso i 3?
ctrl-alt-delor,

@ ctrl-alt-delor È solo un esempio: "ci sono 26 ^ 3 (17576) possibilità diverse in tre lettere ".
Riccioli d'oro

2

Il concetto di "maiuscolo / minuscolo" può essere (ed è in effetti) una cosa specifica della locale, che, come qualsiasi altra complicazione progettuale dovrebbe essere spinta il più vicino possibile al punto di utilizzo nello stack dell'applicazione, non fare parte del nucleo.

Avere un ambiente sensibile al maiuscolo / minuscolo consente di inserirlo in un ambiente insensibile al maiuscolo / minuscolo, ma non viceversa.


1

Non è il terminale, è il file system. O nel caso di cd(cd è una shell integrata) la shell, che distingue tra maiuscole e minuscole.

Sarebbe stato possibile (almeno con ASCII) rendere insensibile al maiuscolo / minuscolo. Questo è più difficile con l'unicode ora utilizzato (se due caratteri sono uguali, può dipendere da local).

Cosa fare al riguardo

  • Convivici.
  • Prova queste opzioni di shell. Danno un compromesso e semplificano le cose, senza introdurre tutti i problemi di insensibilità al caso.
    • shopt -s nocaseglob #questo è nel mio ~/.bashrc
    • shopt -s nocasematch #questo sarebbe anche dentro ~/.bashrc
    • set completion-ignore-case on #questo è nel mio ~/.inputrc

-2

Come punto di partenza, il motivo per cui questa domanda è stata posta e il motivo per cui troverai molte discussioni su di te se si tratta dell'argomento di Google, è che la distinzione tra maiuscole e minuscole rende più difficile per le persone "normali" imparare e usare un linguaggio di programmazione o una riga di comando interfaccia.

La distinzione tra maiuscole e minuscole ha le sue origini nella bassa potenza dei computer in passato. Per rendere le cose insensibili alle maiuscole e minuscole è stata necessaria un'operazione di analisi aggiuntiva prima che il comando fosse inviato all'interprete o a un compilatore prima della sua esecuzione e i primi progettisti non erano preparati a sprecare la potenza del computer per la comodità della distinzione tra maiuscole e minuscole.

Credo che ci siano alcune affermazioni errate nei commenti fatti sopra. In primo luogo, gli psicologi ti diranno che gli umani non discriminano automaticamente tra una parola scritta in lettere maiuscole o minuscole o persino una combinazione delle due in termini di significato della parola. Il caso viene utilizzato nei normali linguaggi espressivi per trasmettere un significato aggiuntivo. Ad esempio, l'uso di una lettera maiuscola che inizia una parola in una frase, indica che molto probabilmente è un nome proprio. Le lettere maiuscole sono anche usate per dare una struttura in prosa. Ad esempio, una lettera maiuscola viene utilizzata per indicare l'inizio di una frase. Ma "Parola" e "parola" sono visti dalla mente umana come significato uguale.

I creatori di DOS e di ADA e Pascal, per citarne alcuni, hanno apprezzato il fatto che la distinzione tra maiuscole e minuscole costituiva un ulteriore onere per il principiante. Successivamente, gli editor di testo in "Ambienti di sviluppo integrato" (IDE), riconoscendo una parola di riserva, potrebbero rifondere quella parola in modo che fosse comunque coerente con lo stile; inoltre visualizzalo in un colore diverso per far risaltare la parola. Quindi l'argomento che la distinzione tra maiuscole e minuscole rende il codice più leggibile è fallace. Non è per le persone "normali". Aggiunge semplicemente un livello non necessario e talvolta confuso a un'attività già impegnativa.

Java è un esempio estremo di un linguaggio molto scarso dal punto di vista della facilità d'uso da parte di un principiante. Fa rispettare la rigida maiuscole / minuscole ma, stupidamente, consentirà al programmatore di avere due funzioni, entrambe con lo stesso nome, ma che sono in realtà funzioni diverse in virtù del fatto che l'una ha una serie di argomenti diversa dall'altra. In effetti, Java è un tale aborto di una lingua che quando le università sono passate dall'insegnamento della sintassi Pascal agli studenti, intraprendendo corsi di informatica, il tasso di abbandono è sceso dal 70% al 40% circa.

Quindi, in sintesi, la distinzione tra maiuscole e minuscole è dovuta a due motivi. Uno era la mancanza di potenza del computer. Il secondo era che le persone che si fanno strada nell'informatica sono spesso nello spettro autistico e non si relazionano bene con le esigenze delle persone "normali". Di conseguenza, queste persone non riescono ad apprezzare che la distinzione tra maiuscole e minuscole sia sia superflua sia un ostacolo all'apprendimento e all'uso di un linguaggio di programmazione.


1
Vorrei rimuovere la sezione su Java perché è, imho, basata sull'opinione e oltre al punto (il sovraccarico del metodo ha poco a che fare con la distinzione tra maiuscole e minuscole) ... il sovraccarico del metodo / funzione si trova anche in altre lingue, come C ++ e pl / sql per citarne solo due. Per quanto riguarda il tuo paragrafo di psicologia, penso che le fonti sarebbero carine ... Infine, l'ultimo paragrafo è anch'esso basato sull'opinione e offensivo e dovrebbe essere rimosso.
thararpy

Per darti una migliore comprensione del perché C e tutte le lingue che sono state generate da essa hanno danneggiato la causa dell'informatica, ti preghiamo di andare a; linkedin.com/pulse/… Il nocciolo di questo problema, o dovrei dire il kernel :-), è che i programmatori sono di un tipo di personalità non preoccupati di diffondere la conoscenza ma di ottenere un lavoro fatto. Se non sei d'accordo con quanto è stato detto in questo post, ti preghiamo di avanzare un argomento a sostegno delle tue posizioni. Le opinioni contano poco.
Kevin Loughrey,

Concordo sul fatto che la distinzione tra maiuscole e minuscole rende l'apprendimento più difficile. Ma nota che quasi tutto in Unix è in minuscolo, quindi tienilo così. Un'eccezione importante è che le variabili di ambiente sono convenzionalmente tutte le capitali.
ctrl-alt-delor,

Il caso dovrebbe essere usato in modo coerente e, come detto in questa risposta, per trasmettere ulteriori informazioni, ad esempio la variabile di ambiente e la normale variabile di shell.
ctrl-alt-delor,

-3

La distinzione tra maiuscole e minuscole è un'idea sciocca nata perché gli scrittori Unix non hanno capito che ASCII è progettato per essere facilmente insensibile alle maiuscole. Uno semplicemente ignora i bit iniziali. Ascii è una codifica a 7 bit con la maiuscola A al valore decimale 65 1000001 e una al decimale 97 1100001. con le lettere che seguono in ordine alfabetico. Ciò ha generato idee di ogni genere, come tutte le chiavi nelle coppie di valori chiave dovrebbero essere numeriche per evitare che le pantofole siano diverse dalle pantofole. Scegli database multi-valore realizzato questo dall'inizio ed è senza distinzione tra maiuscole e minuscole.


2
"Silly" è la tua opinione. C'è molto poco di fatto in questa risposta che posso vedere. Oh, e perché limitarti ad ASCII. C'era anche EBCDIC.
roaima,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.