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


17

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


6
UNIX约定是使用小写字母表示命令名称,但是您可以随意调用它们。

1
确实,UNIX不在乎您所说的命令。这会造成很多痛苦和折磨,但您甚至可以在其中包含空格的命令中执行:按预期echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"生成hello world。(当然,假设~/bin在您$PATH的手中)。
derobert

查看这个问题以及我可能太长的教程
伊曼纽尔·伯格

Answers:


13

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

一些注意事项:

  • 您将很难创建一个称为...;-) 的命令文件。
  • 那些已经采取的标准命令或shell内建或关键字(至少是最常见的炮弹像避免名称bashzshtcshksh)。在这方面,大写字母可以提供帮助,因为标准命令通常不使用大写字母。
  • 最好限制为ASCII字符。非ASCII字符在各种字符集中的表示方式不同
  • 在浏览时,请限制在字母,数字,破折号,点和下划线之间。合法的其他任何东西都可能导致此工具或其他工具出现问题(例如,|=&还有许多其他问题需要在shell中转义,如果使用:,则您的命令不能用作某人的登录shell ... )。你甚至可能需要排除.-未在许多炮弹函数名允许的,如果你希望允许用户在一个shell函数包装你的命令。
  • 使第一个字符成为字母。同样,这不是严格的要求。但是下划线有时用于特殊的事物(例如在zsh完成系统开始的功能中_),而全数字命令在诸如之类的问题中可能会出现问题cmd>output.log。名称以点开头的文件将被诸如lsshell globbing之类的东西和许多文件管理器所隐藏。

对。因此,我想可以归结为,除非有充分的理由,否则不要使用任何异常的东西。即使是您的第二点,我也不认为使用大写字母覆盖这些外壳很聪明-命名命令来描述更改是否更好?喜欢zsh_with_some_funky_option(而不是ZSH)?
伊曼纽尔·伯格

别名是命令吗?因为如果是的话,我打字的时间就很容易了alias .="echo Hello".-)(嗯,sudo vim /bin/.虽然更难...)
Alois Mahdal

@AloisMahdal这就是为什么我说命令文件。zsh也允许.() echo Hello。pdksh也是如此,但是.特殊的内置函数在那里优先。
斯特凡Chazelas

糟糕,我的误解...有趣的一点是关于pdksh的优先顺序...
Alois Mahdal

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

因此在所有Ubuntu 12.04中为758。完整清单:https//gist.github.com/5264777


不是Xdialog吗 :o并且您应该引用grep的参数以避免执行前shell在当前目录中将其扩展。
manatwork

不要在系统上安装它:)
Dennis Kaarsemaker

2
我想坚持使用引号grep的参数:pastebin.com/Gak7x9rN(是的,我可以自己编辑它,但我希望您理解为什么。)
manatwork 2013年

1
好吧,这可能也取决于外壳。我在示例中使用大写字母表示可移植性,但我bash的主目录中的内容实际上[A-Z]扩展为“ cdfhjmpqrt”。因此不区分大小写。
manatwork 2013年

1
更不用说zshbash的failglob选项了。我个人通常的名字我的临时文件(在~abc...和我的临时迪尔斯ABC...
斯特凡Chazelas

4

最著名的命令是stty,它也可以作为STTY。使用将终端设置回正常状态非常方便STTY SANE


/bin/stty什么都没有。想详细说明您的答案吗?
伊曼纽尔·伯格

2
在过去的好日子里,您的终端可能会变得如此混乱,以至于所有内容都是大写的。这样键入a,终端将看到A。要恢复理智,可以使用stty sane命令。除了这个,现在是不可能的,因此其stty可以作为STTY非常欢迎。我什至不记得上次我需要的时候了:)
Dennis Kaarsemaker

@DennisKaarsemaker:哇!那是一段很酷的历史!
伊曼纽尔·伯格

1
伙计们(ott--和@DennisKaarsemaker),您倒退了。我发布了另一个答案以进行澄清。
斯特凡Chazelas

4

关于历史STTY命令的一些注释,以澄清其他答案和相关注释中的一些错误:

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

Unix是区分大小写的,而大多数命令是小写的,您可以看到那里存在一个问题。这就是为什么要使用特殊的termio / termios模式(即使那些终端已经消失了,在现代Unices中仍然存在)。

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

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

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

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

stty命令有相应的iuclcolcucxcase设置和所有三个的别名:lcase。默认设置和您得到的内容stty sane都是lcase关闭的。

因此,当您使用VT50时,只需执行以下操作:

stty lcase

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

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

如果您在普通终端上运行stty lcasestty olcuc由于错误操作(在xterm任何其他现代终端上尝试),都需要在此处输入stty sane才能恢复正常。但是您不需要STTY为此的命令。如果键入stty sane,您看到STTY SANE回显,但这只是将被翻译的显示文本(不是输入的命令),仍然stty sane是将要运行的命令。

这些iuclcolcucxcase用来标志由POSIX指定(这可能是为什么它是在Linux上实现的,即使我严重怀疑任何人曾经连的那些老终端到Linux系统(不是为了好玩除外)),但已被删除POSIX:2001年。


2

在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个(我最不了解)。


1
50个,但25个不同。
斯特凡Chazelas

0

在Debian sid上,使用zsh和ls -1 $path | grep '[A-Z]',我得到

GET
HEAD
HtFileType
Mail
POST
Pnews
Rnmail
X
X11
Xephyr
Xorg
ircII
amuFormat.sh
hpljP1005
hpljP1006
hpljP1007
hpljP1008
hpljP1505

编辑:请注意,在上面的命令中,这是数字1,而不是字母l。一列合一。


1
随着zsh运行:type -m '*[A-Z]*'
斯特凡Chazelas

@StephaneChazelas:好的,您的显示搜索路径,还包括shell函数。但是我的也是zsh特有的:小写$path一次不在bash中。好吧,信息越多越好。
伊曼纽尔·贝格

1
是的,我并不是说您的观点是错误的,只是提出了一个替代方案(尽管我同意这不是最好的措辞)。请注意,$path它不是特定于zsh的。它来自csh/tcsh您的命令也起作用的地方。
斯特凡Chazelas

@StephaneChazelas:啊哈,这很有趣!不,我的命令不是“错误的”,但我同意您的命令更好,因为包括外壳函数和别名是有意义的。至少对我而言,是这样,因为当我使用计算机时,只要我可以运行它并能完成它的工作,我都不在乎它是二进制文件,脚本,函数,别名还是其他名称。(我猜这-m是“比赛”的意思。)
伊曼纽尔·伯格
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.