Linux 命令可以有大写字母吗?

18 linux command-line shell

Linux 命令可以有大写字母吗?我知道它是受支持的,但我想确定它是“问题”还是被认为“不是一件好事”?

Den*_*ker 27

是的,它可以,而且已经有一些了。比如/usr/bin/X:)

dennis@lightning:~$ ls {/usr{/local,},}/{s,}bin | grep '[A-Z]'
MAKEDEV
amuFormat.sh
GET
HEAD
Mail
POST
X
X11
Xephyr
Xnest
Xorg
NetworkManager

dennis@lightning:~$ zcat ~/.cache/apt-file /archive.ubuntu.com_ubuntu_dists_precise_Contents-i386.gz | tail -n +33 | cut -f1 | grep -P '^(usr/)?s?bin/.*[A-Z]' | wc -l
758
Run Code Online (Sandbox Code Playgroud)

所以在所有 Ubuntu 12.04 中都是 758。完整列表:https : //gist.github.com/5264777

  • 我想坚持引用`grep`的参数:http://pastebin.com/Gak7x9rN(是的,我可以自己编辑它,但我希望你明白为什么。) (2认同)

Sté*_*las 16

Unix 上的命令名称没有限制。任何文件都可以是命令。并且文件名可以是除 ASCII NUL 或 ASCII 之外的一个或多个字符(尽管有限制)的任何序列/zsh甚至取消了对可以使用任何字符串作为函数名称的函数的限制。

不过有几点说明:

  • 您将很难创建一个名为...;-)的命令文件。
  • 那些已经采取的标准命令或shell内建或关键字(至少是最常见的炮弹像避免名称bashzshtcshksh)。在这方面,大写字符会有所帮助,因为标准命令通常不使用它们。
  • 最好限制为 ASCII 字符。非 ASCII 字符在现有的各种字符集中的表达方式不同
  • 当你在做的时候,限制自己使用字母、数字、破折号、点和下划线。别的,而法律,可能会导致一个问题,或者其他有这样或那样的工具(例如|=&和许多其他需要在炮弹进行转义,如果你使用:,你的命令不能作为一个登录shell ... )。您甚至可能希望在许多 shell 的函数名称中排除.-不允许的,以防您希望允许用户将您的命令包装在 shell 函数中。
  • 将第一个字符设为字母。再次,不是严格的要求。但是下划线有时用于特殊的事情(例如在zsh以 开头的完成系统中的函数中_),并且全数字命令在诸如cmd>output.log. 名称以点开头的文件将被lsshell 通配符或许多文件管理器之类的东西隐藏。


Sté*_*las 5

关于历史STTY命令的一些注释,以澄清其他答案和相关评论中的一些不准确之处:

早期的终端如DEC VT05VT50以及之前的电传打印机仅支持大写字符。这意味着不能从它们输入小写字符,或者它们不能显示除大写字母以外的任何其他字母。

Unix 区分大小写并且大多数命令都是小写的,您可以看到那里存在问题。这就是为什么有特殊的 termio/termios 模式(即使这些终端早已不复存在,现代 Unices 中仍然存在)来处理这些。

termio/termios 分别是在 Unix 上控制 tty 驱动程序的较旧和较新的接口。在 termio(s) 中ioctl,您指定输入、输出、控制标志......指定如何将串行线上的电信号处理为输入和输出字符以及驱动程序的内部行为,例如回声、行编辑器...其中大部分适用于虚拟终端,如现代 Unix VGA 控制台或伪终端。

命令行界面termio(s)stty命令。

为了处理大写终端,termio(s)涉及三个标志:

  • IUCLC(输入大写转小写):输入的字符在输入时转换为小写。这意味着A终端发送的被视为a. 这意味着启用此功能后,我现在可以LS在我的 VT50 上输入,并且外壳ls将从/dev/ttyX. 我现在也可以运行stty命令了。
  • 现在,使用IUCLC单独和终端echo,当我输入时LS,驱动程序会发送ls回终端(所以我可以看到我输入的内容)它无法显示,所以我们还需要OLCUC(输出小写到大写),即在发送到终端之前,我们需要将任何小写字母转换为大写字母。
  • 现在,我们可以在 VT50 上操作 Unix,但是如果我们现在要输入大写字符怎么办?这就是xcase 本地标志的用武之地。这允许(仅在规范输入模式下)A通过键入发送大写字母\A,并在输出时将大写字母A呈现为\A. (那个没有在 Linux 上实现)

stty命令具有相应的iuclc,olcucxcase设置以及所有三个的别名:lcase。默认设置和您得到的结果stty sanelcase关闭的。

因此,当您使用 VT50 时,您需要做的就是运行:

stty lcase
Run Code Online (Sandbox Code Playgroud)

能够做任何事情。但是等等,当你只能发送大写字母时,你怎么做?这就是您需要一个STTY命令作为 的别名的地方stty,这就是为什么stty支持LCASE作为lcase.

没有这样的SANE别名,因为stty sane当您的终端全部大写时您不想这样做。

如果您在普通终端上运行stty lcasestty olcuc错误地运行(在xterm或任何现代终端中尝试),那么您需要在那里输入stty sane才能恢复正常。但是你不需要STTY命令。如果您键入stty sane,您看到STTY SANE回显,但这只是将被翻译的显示文本(而不是输入的命令),它仍然stty sane是将运行的命令。

那些iuclc, olcuc,xcase标志曾经由 POSIX 指定(这可能就是它在 Linux 上实现的原因,尽管我严重怀疑有人曾经将这些旧终端中的任何一个连接到 Linux 系统(除了为了好玩)),但已在POSIX:2001。