列出所有可用的命令和别名的Linux命令

335

有没有一个Linux命令可以列出此终端会话中所有可用的命令和别名?

就像您键入'a'并按Tab键一样,但适用于字母表中的每个字母。 或者运行“alias”,但也返回命令。

为什么?我想运行以下命令,以查看命令是否可用:

ListAllCommands | grep searchstr

1
按两次 TAB 键以列出环境中可用的所有命令。 - ntshetty
请参考关于 compgen此回答 - Matthias Braun
20个回答

687
你可以使用bash(1)内置的compgen命令:
  • compgen -c将列出您可以运行的所有命令。
  • compgen -a将列出您可以运行的所有别名。
  • compgen -b将列出您可以运行的所有内置命令。
  • compgen -k将列出您可以运行的所有关键字。
  • compgen -A function将列出您可以运行的所有函数。
  • compgen -A function -abck会一次性列出上述所有信息。
请查看手册以获取其他补全选项。 直接回答你的问题:
compgen -ac | grep searchstr

应该能够满足你的需求。


2
对于csh/tcsh是否有类似的功能?这些终端也有一些在按Tab键时使用的自动完成功能,所以可能存在某些东西。 - krb686
3
与其使用“compgen | grep”,如果已知字符串是一个前缀(如问题中所示),将字符串作为参数直接传递给“compgen”本身可能更有效。在这种情况下,可以使用“compgen -ac searchstr”。 - Toby Speight
1
@MarAvFe:这是因为它是一个“bash”内置命令,而不是具有自己的手册页的单独命令。您需要阅读“bash(1)”手册页,或在“bash”命令行上运行“help compgen”。 - camh
2
通过执行命令 compgen -c | sort | uniq | less,可以按字母顺序打印出所有可用的命令,并去除重复行。 - Fabián
1
@endolith 这是一个bash内置命令。sh没有它(假设是Bourne shell - 我不知道/system/bin/sh是什么 - 那是一个相当非标准的路径)。 - camh
显示剩余5条评论

45

添加到 .bashrc 文件中

function ListAllCommands
{
    echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n' | sort -u
}
如果您也想要别名,则可以使用以下方式:
function ListAllCommands
{
    COMMANDS=`echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n'`
    ALIASES=`alias | cut -d '=' -f 1`
    echo "$COMMANDS"$'\n'"$ALIASES" | sort -u
}

1
如果唯一的目的是将输出通过grep进行,为什么要费心排序呢?Unix哲学是制作简单的工具,然后在需要时将它们链接在一起,因此在ListAllCommands中留出sort,如果用户想要排序输出,他们可以这样做。 - danio
4
去重排序。 - Ants Aasma
你也可以使用 -perm -111。 - Kyle Strand
1
这不会找到符号链接到可执行文件的命令。请使用-L选项来跟随符号链接到其目标。注意:-L是一个选项而不是匹配表达式的一部分,因此必须在命令行路径之前放置。在此情况下,使用find -L {} - Adaephon
1
可能需要将 STDERR 重定向到 /dev/null 以抑制不存在目录的警告。echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 用于 zsh 兼容性) - TheLonelyGhost
显示剩余6条评论

32

这里有

type -a mycommand

查看在$PATH中使用mycommand命令的所有别名和命令的命令。可以用来检查该命令是否存在于多个变体中。除此之外...可能有一些脚本解析$PATH和所有别名,但不知道是否有这样的脚本。


1
即使它不是问题的答案,我认为它比调用grep更好地解决了这个问题。因此,您可以执行type -a foo,如果foo不可用,则返回命令未找到或类似的内容。因此,您可以在不调用命令本身的情况下检查命令。 - Janusz
1
实际上这是对问题的回答,因为OP问道“我想运行以下命令并查看是否可用”,所以目的是查看命令是否可用,而这个答案显然有效。 - lothar
2
@lothar,如果你要找的命令是“startserver”,“serverstart”或者“server-something-or-other”,怎么办?我知道了,我会用“grep -i”查找是否有“server”。哎呀,不好了。这个解决方案行不通。朋友们 :-) 我不会给这个答案投反对票(因为它在某种程度上还是有用的),但是一个完整的解决方案应该考虑到grep是用于正则表达式而不仅仅是固定字符串。 - paxdiablo

19

由于嵌入式系统需要bash或更完整的xargs版本(busybox受限),因此其他命令对我无效。

以下命令应适用于任何类Unix系统。

按文件夹列出:

ls $(echo $PATH | tr ':' ' ')
列出所有命令的名称
ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort

4
为什么不直接使用 ls $(echo ${PATH//:/ }),而还要依赖于 tr 呢?请帮忙翻译。 - mschilli
2
这就是我想要的。简单而明显。 - Thiago Macedo

6

使用"which searchstr"命令。如果是别名,则返回别名设置;如果是二进制文件则返回路径。

编辑: 如果你正在寻找别名列表,可以使用:

alias -p | cut -d= -f1 | cut -d' ' -f2

将其添加到任何你喜欢的PATH搜索答案中。假设你正在使用bash。

5

或者,您可以获取一个方便的命令列表,其中包含快速描述(只要该命令有手册页面,大部分都有):

apropos -s 1 ''

-s 1 returns only "section 1" manpages which are entries for executable programs.

'' is a search for anything. (If you use an asterisk, on my system, bash throws in a search for all the files and folders in your current working directory.)

然后你只需像想要的那样使用grep。
apropos -s 1 '' | grep xdg

输出:

xdg-desktop-icon (1) - command line tool for (un)installing icons to the desktop
xdg-desktop-menu (1) - command line tool for (un)installing desktop menu items
xdg-email (1)        - command line tool for sending mail using the user's preferred e-mail composer
xdg-icon-resource (1) - command line tool for (un)installing icon resources
xdg-mime (1)         - command line tool for querying information about file type handling and adding descriptions for new file types
xdg-open (1)         - opens a file or URL in the user's preferred application
xdg-screensaver (1)  - command line tool for controlling the screensaver
xdg-settings (1)     - get various settings from the desktop environment
xdg-user-dir (1)     - Find an XDG user dir
xdg-user-dirs-update (1) - Update XDG user dir configuration

结果似乎没有排序,因此如果你正在寻找一个长列表,你可以在中间加上 | sort | ,然后将其传递到像 less/more/most 这样的翻页器中。例如:

apropos -s 1 '' | sort | grep zip | less

这将返回一个已排序的命令列表,其中所有命令都包含“zip”在其名称或简短描述中,并使用“less”分页器。 (您还可以将“less”替换为$PAGER并使用默认分页器。)


5

试试这个脚本:

#!/bin/bash
echo $PATH  | tr : '\n' | 
while read e; do 
    for i in $e/*; do
        if [[ -x "$i" && -f "$i" ]]; then     
            echo $i
        fi
    done
done

2
这是目前唯一的代码解决方案,它可以为所有命令执行此操作,而不仅仅是查看给定已知命令是否存在。+1。 - paxdiablo

4

针对Mac用户(find 不包含 -executable选项,xargs 不包含 -d 选项):

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -perm '++x'

谢谢。实际上我正在使用非Mac的Unix系统,@AntsAasma的答案在这里不起作用。这个方法对我在Mac和Unix系统上都有效。请问有什么命令可以确定我所使用的Unix版本,以便我能够回复并帮助其他人解决类似问题? - prismaticorb
Linux <公司专有构建信息在这里> 2011年12月12日周一13:34:16 EST x86_64 x86_64 x86_64 GNU/Linux - prismaticorb

3
这里有一个解决方案,可以给你提供所有可执行文件和别名的列表。它也可以在没有“xargs -d”(例如Mac OS X)的系统上使用,并正确处理其中包含空格的路径。
#!/bin/bash
(echo -n $PATH | tr : '\0' | xargs -0 -n 1 ls; alias | sed 's/alias \([^=]*\)=.*/\1/') | sort -u | grep "$@"

用法:myscript.sh [grep选项] 模式,例如要查找所有以ls开头的命令(不区分大小写),请执行:

myscript -i ^ls

3

根据命令的关键字列出命令是非常有用的。

使用:man -k "关键字"

可以随意与| grep "另一个单词"结合使用

例如,查找文本编辑器: man -k 编辑器 | grep 文本


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接