Ubuntu 的所有单字母命令是什么?

Win*_*nix 10 command-line

我在设置时遇到了这个命令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
Run Code Online (Sandbox Code Playgroud)

这让我想知道 Ubuntu 中的所有单字母命令是什么。我没有找到确切的参考,但我找到了这个网站:

此处w列出了该命令以及:

  • . 获取我使用过的文件的命令
  • v是未在 Ubuntu 中安装的命令。据说等价于ls -l -b. 这又类似于llUbuntu的别名设置,除了不包括以.(包括臭名昭著的...)开头的文件。

默认情况下,Ubuntu 中是否安装了其他单字母命令?

Eli*_*gan 28

TL;DR:这会告诉您名称为单个字符的每个命令,尽管您可能想要简化或以其他方式调整它:

(set -f; type -a $(compgen -cX '!?' | sort -u))
Run Code Online (Sandbox Code Playgroud)

列出单字符命令 compgen

Bash 具有制表符compgen补全功能,并提供了一个内置功能,可让您深入了解文本的补全方式。通过运行compgen -c,您可以列出系统上的所有命令。因此,列出只有一个字符长的所有命令的一种方法是过滤输出compgen -c

compgen -c | grep '^.$'
Run Code Online (Sandbox Code Playgroud)

正如steeldriver指出的compgen接受一个-X选项来进行自己的过滤。有点不直观,操作数 to-X是一个匹配被删除的模式。它支持像文件名扩展一样工作的通配语法,但也支持一个初始!来否定它,在这里达到预期的效果。(有关语法的更多信息,请参阅Programmable Completion Builtins。)?匹配任何单个字符,因此!?匹配任何不是单个字符的内容,因此-X '!?'删除所有不是单个字符的内容,只留下单字符命令:

compgen -cX '!?'
Run Code Online (Sandbox Code Playgroud)

这以相同的顺序显示了与管道相同的结果grep。您可以将-c-X作为一个参数作为-cX或(如steeldriver 所示)作为两个参数传递-c -X

在我的系统上,我得到:

l
p
{
}
!
.
:
[
s
t
[
X
w
Run Code Online (Sandbox Code Playgroud)

st我的系统上是剧本我写的; 您很可能没有使用这些名称的命令。你可能还有其他人。

这些是否都是真正的命令取决于人们认为什么是命令。{, }, and!shell 关键字,如if, case, while, 和for。其他(包括 shell 内置命令)是通常意义上的明确命令。

重复结果的意义

某些命令(例如[上述输出中的命令)可能会重复。当存在多个同名命令时会发生这种情况。Bash[作为内置的 shell提供,但它也是一个位于/usr/bin. 运行显示命令的类型,如果是外部命令,则显示它所在的位置。当有多个同名命令时,显示实际使用的命令。作为Kulfy已经指出的,可以使用所有看到它们。type cmdcmdtype -a cmd

$ type -a [
[ is a shell builtin
[ is /usr/bin/[
Run Code Online (Sandbox Code Playgroud)

有可能出现重复的另一个原因:在某些系统上,/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即使当将是可用/usr的是,还没有被安装在NFS体积)。但是现在这通常不会带来好处。因此,较新的系统倾向于统一它们。如果您使用的是较新版本,则可能有此版本,除非您从没有.

如果您愿意,可以对输出进行排序compgen并删除重复项:

compgen -c | grep '^.$' | sort -u
Run Code Online (Sandbox Code Playgroud)
compgen -cX '!?' | sort -u
Run Code Online (Sandbox Code Playgroud)

显示所有命令的详细信息

有关更多详细信息,您可能希望知道每个命令的类型以及:

  • 对于外部命令,它们所在的位置。
  • 对于别名和 shell 函数,它们是如何定义的。

如上所述,Bash 的type内置函数会告诉你这一切。您可以编写一个命令来提供compgento的过滤输出type

type $(compgen -c | grep '^.$')
Run Code Online (Sandbox Code Playgroud)
type $(compgen -cX '!?')
Run Code Online (Sandbox Code Playgroud)

如果你有一个*or?命令,那会表现得很糟糕。这不太可能,但并非不可能。为了防止这种情况,您可能需要禁用通配符:

(set -f; type $(compgen -c | grep '^.$'))
Run Code Online (Sandbox Code Playgroud)
(set -f; type $(compgen -cX '!?'))
Run Code Online (Sandbox Code Playgroud)

但这(使用这四个选项中的任何一个)是不完美的,因为所有同名命令都有相同的解释,这仅适用于第一个。例如,在我的系统上,我得到:

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
Run Code Online (Sandbox Code Playgroud)

您可能只想查看有关每个同名命令第一次出现的信息(例如,shell builtin [)。毕竟,当您编写的命令的第一个单词是这些单字符名称中的任何一个(例如,[ -f /bin/nano ]运行 shell 内建的[,而不是/usr/bin/[这些才是实际运行的。如果是这样,您可以compgen在将结果提交给之前对输出进行排序并删除重复项type

type $(compgen -c | grep '^.$' | sort -u)
Run Code Online (Sandbox Code Playgroud)
type $(compgen -cX '!?' | sort -u)
Run Code Online (Sandbox Code Playgroud)

或者,为了防止通配:

(set -f; type $(compgen -c | grep '^.$' | sort -u))
Run Code Online (Sandbox Code Playgroud)
(set -f; type $(compgen -cX '!?' | sort -u))
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要有关所有命令的信息(例如,/usr/bin/[以及[),则可以传递-atype。我建议您仍然首先对结果中的重复项进行排序和删除,否则您会在输出中得到大量重复。

type -a $(compgen -c | grep '^.$' | sort -u)
Run Code Online (Sandbox Code Playgroud)
type -a $(compgen -cX '!?' | sort -u)
Run Code Online (Sandbox Code Playgroud)

或者,为了防止通配:

(set -f; type -a $(compgen -c | grep '^.$' | sort -u))
Run Code Online (Sandbox Code Playgroud)
(set -f; type -a $(compgen -cX '!?' | sort -u))
Run Code Online (Sandbox Code Playgroud)

您拥有的命令因 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'
Run Code Online (Sandbox Code Playgroud)

因此,您可以更改或删除lper-user中的定义~/.bashrc。或者只是运行unalias l以仅影响您当前的外壳。

  • 我认为最好将 `-a` 选项与 `type` 一起使用,因为 `[ 是内置的 shell`,`[ 是 /usr/bin/[` 和 `[ 是 /bin/[`(至少在我的系统)。 (3认同)