Linux 命令可以使用大写字母吗?我知道它受到支持,但我想确定它是否是一个“问题”或被认为“不是一件好事”?
答案1
是的,可以,而且已经有一些了。例如/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
所以 Ubuntu 12.04 中的总数为 758。完整列表:https://gist.github.com/5264777
答案2
Unix 上的命令名称没有限制。任何文件都可以是命令。文件名可以是除 ASCII NUL 或 ASCII 之外的一个或多个(但最多有限制)字符的任意序列/
。zsh
甚至解除了对可以使用任何字符串作为函数名称的函数的限制。
但有一些注意事项:
- 您将很难创建名为
.
或 的命令文件..
;-)。 - 避免使用标准命令或 shell 内置命令或关键字(至少是最常见的 shell,如 、 或 )已采用
bash
的名称。在这方面,大写字符会有所帮助,因为标准命令通常不使用它们。zsh
tcsh
ksh
- 最好限制为 ASCII 字符。非 ASCII 字符在各种字符集中的表达方式不同
- 当你这样做时,限制自己使用字母、数字、破折号、点和下划线。其他任何内容虽然合法,但可能会导致这个或那个工具出现这样或那样的问题(例如,
|
、=
和&
许多其他命令需要在 shell 中转义,如果您使用:
,则您的命令不能用作登录 shell... )。如果您希望允许用户将您的命令包装在 shell 函数中,您甚至可能希望排除许多 shell 中不允许出现在函数名称中的.
和。-
- 将第一个字符设为字母。再次强调,这不是一个严格的要求。但下划线有时用于特殊的事物(例如在
zsh
以 开头的完成系统的函数中_
),并且全数字命令在诸如 之类的事物中可能会出现问题cmd>output.log
。名称以点开头的文件将被ls
shell 通配符和许多文件管理器等隐藏。
答案3
关于历史命令的一些注释STTY
,以澄清其中的一些不准确之处其他答案和相关评论:
早期的终端如十二月VT05或者VT50之前的电传打字机只支持大写字符。这意味着不能从它们输入小写字符,或者它们无法显示除大写字母之外的任何其他字母。
Unix 区分大小写,并且大多数命令都是小写,您可以看到那里存在问题。这就是为什么有特殊的 termio/termios 模式(尽管这些终端早已不复存在,但在现代 Unices 中仍然存在)来处理这些问题。
termio/termios 分别是控制 Unix 上 tty 驱动程序的旧接口和新接口。在 termio(s) 中ioctl
,您指定输入、输出、控制标志...指定如何将串行线上的电信号处理为输入和输出字符以及驱动程序的内部行为,例如 echo、行编辑器...其中大多数适用于虚拟终端,例如现代 Unix VGA 控制台或伪终端。
命令行界面termio(s)
就是stty
命令。
为了处理大写终端,涉及三个termio(s)
标志:
IUCLC
(输入大写转小写):输入时将传入的字符转换为小写。这意味着A
终端发送的内容被视为a
.这意味着,启用此功能后,我现在可以LS
在 VT50 上键入内容,并且 shellls
将从/dev/ttyX
.我现在也可以运行该stty
命令。- 现在,使用
IUCLC
alone和terminalecho
,当我输入时LS
,驱动程序会发送ls
回终端(这样我可以看到我输入的内容),但它无法显示,所以我们还需要OLCUC
(输出小写到大写),即在发送到终端之前,我们需要将所有小写字母转换为大写字母。 - 现在,我们可以在 VT50 上操作 Unix,但是如果我们现在想输入大写字符怎么办?那就是
xcase
当地的标志出现。这允许(仅在规范输入模式下)A
通过键入发送大写字母\A
,并且在输出时,大写字母A
呈现为\A
。 (该功能未在 Linux 上实现)
该stty
命令具有相应的iuclc
、olcuc
设置xcase
以及所有三个的别名:lcase
。默认设置和您得到的结果stty sane
是lcase
关闭的。
因此,当您使用 VT50 时,您所需要做的就是运行:
stty lcase
能够做任何事情。但是等一下,当你只能发送大写字母时,你该怎么做呢?这就是您需要一个STTY
命令作为 的别名的地方stty
,这就是为什么stty
支持LCASE
作为 的别名lcase
。
没有这样的别名,因为当您的终端全部大写时SANE
您不想这样做。stty sane
如果您在普通终端上运行stty lcase
或stty olcuc
错误地运行(在或任何现代终端中尝试xterm
),则需要输入stty sane
才能恢复正常。但你不需要STTY
为此命令。如果您输入stty sane
,您将要看到STTY SANE
回显,但这只是将被翻译的显示文本(而不是输入的命令),它仍然是stty sane
将运行的命令。
这些iuclc
, olcuc
,xcase
标志曾经由 POSIX 指定(这可能就是它在 Linux 上实现的原因,尽管我严重怀疑有人曾经将这些旧终端连接到 Linux 系统(除了为了好玩)),但已在POSIX:2001。
答案4
在 Fedora 18 上:
amuFormat.sh
chkrootkitX
enum_chmLib
enumdir_chmLib
extract_chmLib
fakeCMY
GET
HEAD
Mail
oLschema2ldif
POST
smoltDeleteProfile
smoltGui
smoltSendProfile
smp_conf_zone_man_pass.#prelink#.coLtYv
Terminal
test_chmLib
Thunar
X
Xephyr
xfig-Xaw3d
Xorg
Xvnc
MAKEDEV
NetworkManager
amuFormat.sh
chkrootkitX
enum_chmLib
enumdir_chmLib
extract_chmLib
fakeCMY
GET
HEAD
Mail
oLschema2ldif
POST
smoltDeleteProfile
smoltGui
smoltSendProfile
smp_conf_zone_man_pass.#prelink#.coLtYv
Terminal
test_chmLib
Thunar
X
Xephyr
xfig-Xaw3d
Xorg
Xvnc
MAKEDEV
NetworkManager
总共50个(其中我不认识的最多)。