我在设置时遇到了这个命令ssh
:
$ w
20:01:30 up 6 days, 2:20, 3 users, load average: 0.06, 0.11, 0.10
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
rick tty7 :0 16Jun20 6days 16:51 2.37s /sbin/upstart --user
rick pts/21 192.168.0.12 18:44 1:14m 0.19s 0.00s sleep 60
rick pts/22 192.168.0.12 18:45 0.00s 0.44s 0.01s w
这让我想知道 Ubuntu 中所有的单字母命令是什么。我没有找到确切的参考资料,但我找到了这个网站:
此处w
列出了该命令以及以下内容:
.
我使用过的获取文件的命令v
是 Ubuntu 中未安装的命令。据说它相当于ls -l -b
。这又类似于ll
Ubuntu 设置的 别名,只是不包括以 开头的文件.
(包括臭名昭著的.
和..
)。
Ubuntu 中是否默认安装了其他单字母命令?
答案1
总结:这将告诉您有关名称为单个字符的每个命令的信息,但您可能希望简化或以其他方式调整它:
(set -f; type -a $(compgen -cX '!?' | sort -u))
使用以下命令列出单字符命令compgen
Bash 具有制表符补全功能,并提供了compgen
内置命令,可帮助您了解文本的补全方式。通过运行compgen -c
,您可以列出全部系统上的命令。因此,列出所有只有一个字符长的命令的一种方法是过滤输出compgen -c
:
compgen -c | grep '^.$'
作为钢铁司机有指出,compgen
接受一个-X
选项来进行自己的过滤。有点不直观的是, 的操作数-X
是一个模式,其匹配项是已删除。它支持与文件名扩展类似的通配符语法,但也支持首字母!
来否定它,从而实现此处所需的效果。(参见可编程完成内置函数有关语法的更多信息。)?
匹配任何单个字符,因此!?
匹配任何非单个字符的内容,因此-X '!?'
删除所有非单个字符的内容,仅留下单字符命令:
compgen -cX '!?'
这与通过管道传输到 的结果相同,顺序也相同grep
。您可以将-c
和-X
作为-cX
或 传递(作为steeldriver 展示了它) 在两个参数中为-c -X
。
在我的系统上,我得到:
l
p
{
}
!
.
:
[
s
t
[
X
w
s
并且t
我的系统上有我编写的脚本;您很可能没有使用这些名称的命令。您可能有其他命令。
这些是否都是真的命令取决于人们如何看待命令。{
,}
和!
是shell 关键字,如if
、case
、while
和for
。其他的(包括 shell 内置命令)都是通常意义上的明确命令。
重复结果的含义
某些命令(如[
上面的输出)可能会重复。当存在多个同名命令时,就会发生这种情况。Bash 提供[
作为 shell 内置命令,但它也是位于 中的可执行文件/usr/bin
。运行显示什么类型的命令type cmd
cmd
是,如果是外部命令,则显示其所在位置。当有多个同名命令时,将显示实际要使用的命令。作为库尔菲有指出,您可以使用 查看它们。type -a cmd
$ type -a [
[ is a shell builtin
[ is /usr/bin/[
还有另一个可能的重复源:在某些系统上,/bin
和/usr/bin
实际上是同一个目录(更准确地说:/bin
是的符号链接),您将在和/usr/bin
中看到条目。例如,您可能同时拥有和以及内置命令,以及和以及和。这些在技术上是独立的命令,但它们实际上引用了/bin
/usr/bin
/bin/[
/usr/bin/[
[
/bin/w
/usr/bin/w
/bin/X
/usr/bin/X
相同的可执行文件。
传统上,/bin
和/usr/bin
是单独的目录(这样,/bin
即使 NFS 卷尚未安装, 中的命令也可以使用/usr
)。但如今,这通常不会带来好处。因此,较新的系统倾向于将它们统一起来。如果您使用的是较新的版本,则可能会出现这种情况,除非你从没有。
如果愿意,您可以对输出进行排序compgen
并删除重复项:
compgen -c | grep '^.$' | sort -u
compgen -cX '!?' | sort -u
显示所有命令的详细信息
有关更多详细信息,您可能希望了解每个命令的类型以及:
- 对于外部命令,它们位于何处。
- 对于别名和 shell 函数,它们是如何定义的。
如上所述,Bash 的type
内置命令会告诉您所有这些。您可以编写一个命令,将 的过滤输出提供compgen
给type
。
type $(compgen -c | grep '^.$')
type $(compgen -cX '!?')
如果您有*
or?
命令,则会出现错误。这种情况不太可能发生,但并非不可能。为了防止这种情况发生,您可能需要禁用通配符:
(set -f; type $(compgen -c | grep '^.$'))
(set -f; type $(compgen -cX '!?'))
但是这种方法(使用上述四种方法中的任何一种)并不完美,因为所有同名命令的解释都相同,只有第一种解释是正确的。例如,在我的系统上,我得到:
l is aliased to `ls -CF'
p is aliased to `printf "\e[?2004l"'
{ is a shell keyword
} is a shell keyword
! is a shell keyword
. is a shell builtin
: is a shell builtin
[ is a shell builtin
s is /home/ek/bin/s
t is /home/ek/bin/t
[ is a shell builtin
X is /usr/bin/X
w is /usr/bin/w
您可能只想查看有关每个同名命令(例如,shell 内置命令[
)第一次出现的信息。毕竟,当你编写一个命令,其第一个单词是任何单字符名称时,这些才是真正运行的(例如,[ -f /bin/nano ]
运行 shell 内置的[
,而不是/usr/bin/[
)。如果是这样,您可以对 的输出进行排序compgen
,并在将结果交给 之前删除重复项type
:
type $(compgen -c | grep '^.$' | sort -u)
type $(compgen -cX '!?' | sort -u)
或者,为了防止通配符:
(set -f; type $(compgen -c | grep '^.$' | sort -u))
(set -f; type $(compgen -cX '!?' | sort -u))
但是,如果您需要有关所有命令的信息(例如,/usr/bin/[
以及[
),则可以传递-a
给type
。我建议您仍然先对结果进行排序并删除重复项,否则输出中会出现大量重复。
type -a $(compgen -c | grep '^.$' | sort -u)
type -a $(compgen -cX '!?' | sort -u)
或者,为了防止通配符:
(set -f; type -a $(compgen -c | grep '^.$' | sort -u))
(set -f; type -a $(compgen -cX '!?' | sort -u))
你所使用的命令因 shell 环境而异
请注意,您拥有的单字符命令(就像您通常拥有的命令一样)是 shell 环境的属性。不同的用户或同一用户运行的不同 shell 可能具有不同的可用命令。l
例如,Ubuntu 中的命令在 中定义,在以常规方式创建用户帐户时/etc/skel/.bashrc
将其复制到 中。~/.bashrc
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
l
因此,您可以在每个用户中更改或删除的定义~/.bashrc
。或者只需运行unalias l
即可影响当前的shell。