为什么终端区分大小写?


13

当我这样做时- CD ..而不是cd ..
给我错误提示-

CD: command not found

为什么涉及linux命令时终端区分大小写?我的意思是您应该能够使用“全部大写”或“全部小写”字符执行命令。

我知道这是由于某种原因,但是我很好奇。


9
我几乎觉得应该重新命名这个问题,为什么事情区分大小写?
kojiro

15
“我的意思是,您应该能够使用“全部大写”或“全部小写”字符执行命令。” 真?为什么?
dmckee ---前主持人小猫,

5
问题一stty iuclc olcuc,如果你觉得有一个区分大小写的终端;-)
斯特凡Chazelas

1
CapsLock + c + d + CapsLock比c + d更糟
UniversallyUniqueID

Answers:


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 2013年

3
实际上令人惊讶,因为当时可用的一些常用终端仅是大写字母,并且它们必须实现一种变通方法(如果您希望字母实际上是大写字母,请在字母前加上反斜杠-如果在登录时以全部大写字母键入用户名,则启用in)中的行规驱动程序。
Random832 2013年

8

这不是“终端”问题,它是文件系统功能。Shell如何在(始终区分大小写)文件系统上查找命令?


如果两个或多个命令匹配怎么办?
scai

1
可能对您有所帮助的唯一选项是一个bash选项cdspell:即使您输入了错误的名称,它也会尝试找到正确的文件名,但它仅适用于命令参数
eppesuig 2013年

1
@HussainTamboli有可能被命名为命令cdCDcDCd每一个独特的行为。
scai 2013年

6
它实际上不是文件系统功能或终端功能,而是外壳程序功能。Shell内置插件在不区分大小写的文件系统上区分大小写。而且,大多数shell 会对命令进行哈希处理,因此命令绝不是真正的文件,它们实际上是从哈希中提取的。尝试hash -p /bin/hostname HOSTNAME,现在HOSTNAME是的命令/bin/hostname
kojiro 2013年

2
哦,我还应该提到您可以告诉大多数shell不区分大小写。对于bash,可以绑定set completion-ignore-case on
kojiro

6

我使用和尊重的技术系统几乎都是区分大小写的:操作系统,编程语言或其他。

我现在想到的例外是HTML标记,SQL的某些实现以及Ada编程语言。

即使在那些情况下,我认为也存在着以小写形式实际编写HTML标记以及以大写形式(以及大写的参数)编写SQL查询语义的趋势。(如果我错了,请纠正我。)至于Ada,例如,如果键入一个小写的过程名称,则Emacs模式将纠正您,尽管在编译时并不重要。因此,即使不区分大小写,似乎人们也同意这是一个坏主意。

原因是您在区分大小写时获得了更多的表达能力。不仅在数量上- CD是一个,但是CDCdcD,和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
Pascal和Delphi也不区分大小写。此外,例如具有两个变量length,并Length通常是一个坏主意:)
Ajasja

@Ajasja:这很有趣,因为Ada很像Pascal。好吧,我想如果您把它们全部计算在内,就会有无数这样的语言,因为有太多的编程语言。当然,关于长度,但是您可能会想到这样的情况:Max(一个人)和max(一个包含实数列表并返回最大数的函数)怎么样?
伊曼纽尔·伯格

关于最后一个示例,您可能想知道QL的SuperBasic解释器完全以这种方式将关键字大写: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是内置的shell),则区分大小写。

可能(至少使用ASCII)不区分大小写。使用现在使用的unicode很难(两个字符是否相同,可能取决于本地字符)。

该怎么办

  • 忍受它。
  • 尝试这些shell选项。它们提供了一种折衷方案,并使事情变得容易,而不会引入所有不区分大小写的问题。
    • shopt -s nocaseglob #这是我的 ~/.bashrc
    • shopt -s nocasematch #这也将在 ~/.bashrc
    • set completion-ignore-case on #这是我的 ~/.inputrc

-2

首先,提出这个问题的原因以及如果您选择Google的主题,就会发现很多讨论的原因,是因为区分大小写使“普通”人更难学习和使用编程语言或命令行接口。

区分大小写起源于过去计算机的低功耗。为了使大小写不区分大小写,需要在执行命令之前将其进行另外的解析操作,然后再将其提供给解释器或编译器,并且早期设计者没有准备为了区分大小写而浪费计算机的功能。

我认为上述评论中存在许多错误的主张。首先,心理学家会告诉您,人们不会自动区分以大写或小写字母书写的单词,甚至不会根据单词的含义来区分两者。正常表达语言中使用case来传达其他含义。例如,使用大写字母在句子中的单词开头表示该单词很可能是专有名词。大写字母也用于提供散文结构。例如,大写字母用于指示句子的开头。但是,“单词”和“单词”在人类脑海中被认为是相同的意思。

DOS以及ADA和Pascal的创建者不胜枚举,他们认为区分大小写是初学者的另一个负担。后来,“集成开发环境”(IDE)中的文本编辑器识别出一个保留字,可以重铸该字,使其无论如何与样式保持一致。加上以其他颜色显示,以使单词脱颖而出。因此,区分大小写使代码更具可读性的说法是错误的。不是针对“正常”人。它只是在已经很苛刻的任务上增加了不必要的,有时是令人困惑的层。

从初学者易于使用的角度来看,Java是非常糟糕的语言的极端示例。它具有严格的大小写敏感性,但愚蠢的是,它允许程序员拥有两个具有相同名称的函数,但由于一个函数的参数集不同,实际上它们实际上是不同的函数。确实,Java是对语言的一种堕胎,当大学从讲授Pascal语法的学生转到学习非计算机科学课程的学生时,通过率从大约70%下降到40%。

因此,总而言之,区分大小写是出于两个原因。一是缺乏计算机功能。第二个原因是,进入计算机科学领域的人们经常处于自闭症谱系中,与“正常”人群的需求关系不大。结果,这些人不能意识到区分大小写既不必要,又不利于学习和使用编程语言。


1
我将删除关于Java的部分,因为它基于恕我直言,是基于意见的,除了这一点之外(方法重载与大小写无关)...方法/函数重载也可以在其他语言中找到,例如C ++和pl / sql只是两个。至于您的心理学段落,我认为消息来源会很好。最后,最后一段也是,恕我直言,也是基于观点的,令人反感,应删除。
–carpcarpy

为了使您更好地理解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 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.