Linux命令可以有大写字母吗?我知道它受到支持,但是我想确定这是一个“问题”还是被认为“不是一件好事”?
echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"
生成hello world
。(当然,假设~/bin
在您$PATH
的手中)。
Linux命令可以有大写字母吗?我知道它受到支持,但是我想确定这是一个“问题”还是被认为“不是一件好事”?
echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"
生成hello world
。(当然,假设~/bin
在您$PATH
的手中)。
Answers:
在Unix上,命令名称没有限制。任何文件都可以是命令。文件名可以是ASCII NUL或ASCII以外的一个或多个(尽管不能超过)字符的任何序列/
。zsh
甚至取消了对函数的限制,在函数中可以使用任何字符串作为函数名称。
一些注意事项:
.
或..
;-) 的命令文件。bash
,zsh
,tcsh
或ksh
)。在这方面,大写字母可以提供帮助,因为标准命令通常不使用大写字母。|
和=
,&
还有许多其他问题需要在shell中转义,如果使用:
,则您的命令不能用作某人的登录shell ... )。你甚至可能需要排除.
和-
未在许多炮弹函数名允许的,如果你希望允许用户在一个shell函数包装你的命令。zsh
完成系统开始的功能中_
),而全数字命令在诸如之类的问题中可能会出现问题cmd>output.log
。名称以点开头的文件将被诸如ls
shell globbing之类的东西和许多文件管理器所隐藏。zsh_with_some_funky_option
(而不是ZSH
)?
alias .="echo Hello"
.-)(嗯,sudo vim /bin/.
虽然更难...)
.() echo Hello
。pdksh也是如此,但是.
特殊的内置函数在那里优先。
是的,可以,而且已经有一些。如/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在当前目录中将其扩展。
grep
的参数:pastebin.com/Gak7x9rN(是的,我可以自己编辑它,但我希望您理解为什么。)
bash
的主目录中的内容实际上[A-Z]
扩展为“ cdfhjmpqrt”。因此不区分大小写。
zsh
bash的failglob
选项了。我个人通常的名字我的临时文件(在~
)a
,b
,c
...和我的临时迪尔斯A
,B
,C
...
最著名的命令是stty
,它也可以作为STTY
。使用将终端设置回正常状态非常方便STTY SANE
。
/bin/stty
什么都没有。想详细说明您的答案吗?
a
,终端将看到A
。要恢复理智,可以使用stty sane
命令。除了这个,现在是不可能的,因此其stty
可以作为STTY
非常欢迎。我什至不记得上次我需要的时候了:)
关于历史STTY
命令的一些注释,以澄清其他答案和相关注释中的一些错误:
DEC VT05或VT50等较早的终端以及之前的电传打印机仅支持大写字符。这意味着不能从他们输入任何小写字母,或者除了大写字母以外,他们不能显示其他任何字母。
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
(将小写输出为大写)在发送到终端之前,我们需要将任何小写字母转换为大写字母。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年。
在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个(我最不了解)。
在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
。一列合一。
zsh
运行:type -m '*[A-Z]*'
$path
一次不在bash中。好吧,信息越多越好。
$path
它不是特定于zsh的。它来自csh/tcsh
您的命令也起作用的地方。
-m
是“比赛”的意思。)