AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1252962
Accepted
WinEunuuchs2Unix
WinEunuuchs2Unix
Asked: 2020-06-23 18:27:53 +0800 CST2020-06-23 18:27:53 +0800 CST 2020-06-23 18:27:53 +0800 CST

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

  • 772

我在设置时遇到了这个命令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 中所有的单字母命令是什么。我没有找到确切的参考,但我找到了这个网站:

  • Linux 命令行的 AZ 索引:bash + 实用程序。

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

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

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

command-line
  • 1 1 个回答
  • 3700 Views

1 个回答

  • Voted
  1. Best Answer
    Eliah Kagan
    2020-06-24T00:09:21+08:002020-06-24T00:09:21+08:00

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

    (set -f; type -a $(compgen -cX '!?' | sort -u))
    

    列出单字符命令compgen

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

    compgen -c | grep '^.$'
    

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

    compgen -cX '!?'
    

    这以与管道相同的顺序显示了相同的结果grep。您可以将-cand-X在一个参数中作为-cXor (如steeldriver 所示)在两个参数中作为-c -X.

    在我的系统上,我得到:

    l
    p
    {
    }
    !
    .
    :
    [
    s
    t
    [
    X
    w
    

    s在我的t系统上是我编写的脚本;您很可能没有具有这些名称的命令。你可能确实有其他人。

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

    重复结果的含义

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

    $ type -a [
    [ is a shell builtin
    [ is /usr/bin/[
    

    还有另一个可能的重复来源:在某些系统上,/bin并且/usr/bin实际上是同一个目录(更准确地说:/bin是 的符号链接/usr/bin)并且您会在/bin和中看到条目/usr/bin。例如,您可能同时拥有/bin/[and/usr/bin/[以及[内置函数,以及 both /bin/wand/usr/bin/w和 both /bin/Xand /usr/bin/X。这些在技术上是独立的命令,但它们实际上指的是同一个可执行文件。

    传统上,/bin它们/usr/bin是单独的目录(因此/bin即使/usr是尚未安装的 NFS 卷,其中的命令也可以使用)。但是现在这通常不会带来好处。因此,较新的系统倾向于统一它们。如果您使用的是较新版本,则可能有这个,除非您从没有.

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

    compgen -c | grep '^.$' | sort -u
    
    compgen -cX '!?' | sort -u
    

    显示所有命令的详细信息

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

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

    如上所述,Bash 的type内置函数会告诉你这一切。您可以编写一个命令来提供compgento的过滤输出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 builtin [, not /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'
    

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

    • 28

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve