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

Posted

技术标签:

【中文标题】列出所有可用命令和别名的 Linux 命令【英文标题】:Linux command to list all available commands and aliases 【发布时间】:2010-10-31 04:27:29 【问题描述】:

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

就好像您输入了“a”并按下了制表符,但对于字母表中的每个字母。 或者运行“别名”但也返回命令。

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

ListAllCommands | grep searchstr

【问题讨论】:

按两次 TAB 键列出环境可用的所有命令 参见this answercompgen 【参考方案1】:

你为什么不直接输入:

seachstr

在终端中。

shell 会说类似

seacrhstr: command not found 

编辑:

好的,我投反对票,因为答案很愚蠢,我只想知道:这个答案有什么问题!!!提问者说:

并查看是否有可用的命令。

输入命令会告诉你它是否可用!。

可能他/她的意思是 “不执行命令”“将其包含在脚本中” 但我无法读懂他的想法(不是说我能'不经常只是他穿着 mind reading deflector)

【讨论】:

我想知道formathdd命令是否存在。哦等等,我只是运行它看看。哎呀。谢谢:) 使用“which”可能更安全。 鉴于这是Stack Overflow,而不是Super User,程序化答案会更合适。【参考方案2】:

type -a mycommand

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

【讨论】:

即使它不是问题的答案,我认为它比调用 grep 更好地解决问题。所以你可以做 type -a foo 如果 foo 不可用,它会返回 command not found 或类似的东西。因此,您可以在不调用命令本身的情况下检查命令。 实际上这是对问题的回答,因为OP问“我想运行以下命令并查看命令是否可用”,因此目的是查看命令是否可用这个答案显然有效。 @lothar,如果您要查找的命令是,呃,它是什么,“startserver”?,“serverstart”?,“server-something-or-other”?我知道,我将只为服务器“grep -i”,看看它是否在那里。哎呀。 Bzzz,没有这个解决方案。 matey :-) 我不会否决这个答案(因为即使以有限的方式它也很有用),但一个完整的解决方案会考虑到 grep 用于正则表达式,而不仅仅是固定字符串。【参考方案3】:

在 debian 中:ls /bin/ | grep "whatImSearchingFor"

【讨论】:

可执行文件存在于 $PATH 的所有目录中,而不仅仅是 /bin。【参考方案4】:

你总是可以做到以下几点:

1. Hold the $PATH environment variable value.
2. Split by ":"
3. For earch entry: 
    ls * $entry 
4. grep your command in that output.

只有当它们被列在路径 env var 中时,shell 才会执行命令。

【讨论】:

【参考方案5】:

使用“哪个 searchstr”。如果是别名,则返回二进制文件的路径或别名设置

编辑: 如果您要查找别名列表,可以使用:

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

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

【讨论】:

【参考方案6】:

问题是 tab-completion 正在搜索您的路径,但所有命令都不在您的路径中。

要使用 bash 在路径中查找命令,您可以执行以下操作:

echo $PATH | cut -d":" -f1 中的 x;做 ls $x;完成

【讨论】:

【参考方案7】:

尝试按 ALT-? (alt 和问号同时出现)。给它一两秒钟来构建列表。它应该在 bash 中工作。

【讨论】:

或者尝试在空白行的开头按 Esc 四次。 这非常有用,我还不知道谢谢 :-)【参考方案8】:

试试这个脚本:

#!/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

【讨论】:

这是迄今为止唯一适用于所有命令的代码解决方案,而不仅仅是查看给定的已知命令是否存在。 +1。【参考方案9】:

这是一个可以放入 bashrc 文件的函数:

功能命令搜索 旧IFS=$IFS IFS=“:” 对于 $PATH 中的 p 做 ls $p | 1美元 完毕 导出 IFS=$oldIFS

示例用法:

$ 命令搜索 gnome gnome-audio-profiles-properties* 侏儒弹出@ 侏儒钥匙圈* gnome-keyring-守护进程* 侏儒安装* 侏儒开放* 侏儒录音机* 侏儒文本编辑器@ 侏儒卸载@ 侏儒音量控制* polkit-gnome-授权* vim.gnome* $

仅供参考:IFS 是 bash 用来分割字符串的变量。

当然有一些更好的方法可以做到这一点。

【讨论】:

【参考方案10】:

也许我理解错了,但是如果你按下 Escape 直到你得到 Display All X 可能性怎么办?

【讨论】:

【参考方案11】:

添加到 .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

【讨论】:

这非常接近,但不包括别名。如何附加别名 | cut -f1 到结果,但在排序之前? 如果唯一的目的是通过 grep 输出,为什么还要麻烦排序呢? Unix 的理念是制作简单的工具,然后在需要时将它们链接在一起,因此将排序排除在 ListAllCommands 之外,如果用户希望对输出进行排序,他们可以这样做。 排序是去重复。 这不会找到作为可执行文件符号链接的命令。使用选项-L 跟随符号链接到他们的目的地。注意:-L 是一个选项,而不是匹配表达式的一部分,因此它必须放在命令行上的路径之前。在这种情况下find -L 可能希望将 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 兼容性)【参考方案12】:

这是一个解决方案,可为您提供所有可执行文件别名的列表。它还可以移植到没有 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-options] pattern,例如要查找以ls 开头的所有命令,不区分大小写,请执行以下操作:

myscript -i ^ls

【讨论】:

【参考方案13】:

这取决于,我的意思是它取决于您使用的外壳。这是我看到的限制:

    必须在与您的 shell 相同的进程中运行,以捕获会影响您可以找到的命令的别名、函数和变量,请考虑 PATH 或 EDITOR,尽管 EDITOR 可能超出范围。您可以有未导出的变量来影响事情。 它是特定于 shell 的,或者你进入内核,/proc/pid/enviorn 和朋友没有足够的信息

我使用 ZSH,所以这是一个 zsh 答案,它做了以下 3 件事:

    转储路径 转储别名 转储环境中的函数 对它们进行排序

这里是:

feed_me() 
    (alias | cut -f1 -d= ; hash -f; hash -v | cut -f 1 -d= ; typeset +f) | sort

如果你使用 zsh,应该这样做。

【讨论】:

【参考方案14】:

您可以使用内置的 bash(1) compgen

compgen -c 将列出您可以运行的所有命令。 compgen -a 将列出您可以运行的所有别名。 compgen -b 将列出您可以运行的所有内置程序。 compgen -k 将列出您可以运行的所有关键字。 compgen -A function 将列出您可以运行的所有函数。 compgen -A function -abck 将一口气列出以上所有内容。

查看手册页以了解您可以生成的其他补全。

直接回答你的问题:

compgen -ac | grep searchstr

应该做你想做的。

【讨论】:

csh/tcsh 是否有与此等价的功能?这些终端也有某种在选项卡上使用的自动完成功能,所以也许存在一些东西? 而不是compgen | grep,将字符串作为参数传递给compgen 本身会更有效(如果已知它是前缀,如问题中所暗示的那样)。在这种情况下,就是compgen -ac searchstr @MarAvFe:那是因为它是 bash 内置的,而不是带有自己手册页的单独命令。您需要阅读bash(1) 手册页,或在bash 命令行中运行help compgen 通过扩展,执行compgen -c | sort | uniq | less 将打印所有可用的命令,没有重复的行并按字母顺序排序。 @endolith 这是一个内置的 bash。 sh 不会拥有它(假设 bourne - 我不知道 /system/bin/sh 是什么 - 这是一个相当不标准的路径)【参考方案15】:

对于 Mac 用户(find 没有 -executable 并且 xargs 没有 -d):

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

【讨论】:

谢谢。我实际上正在使用@AntsAasma 答案不起作用的非mac unix。这也适用于我的 mac 和我的 unix。我可以键入什么命令来确定我使用的 unix 版本,以便我可以在这里回复以帮助其他人解决我的问题? Linux 2011 年 12 月 12 日星期一 13:34:16 EST x86_64 x86_64 x86_64 GNU/Linux【参考方案16】:

根据与命令关联的关键字列出命令很有用。

使用:man -k "your keyword"

随意组合:| grep "another word"

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

【讨论】:

【参考方案17】:
compgen -c > list.txt && wc list.txt

【讨论】:

考虑添加一个简短的描述,说明它的作用或它应该如何工作。至少,指定一个参考链接(通常是相关的手册页),以便跟进和理解建议的解决方案。 使用文件并不总是一个好的选择。如果您确实需要,那么至少将其设为 tmp 文件(如果安全不是问题)。compgen -c > /tmp/list.txt && /tmp/wc list.txt【参考方案18】:

列出所有命令的快捷方式。 打开终端并按两次 "tab" 按钮。 那就是在终端中显示所有命令

【讨论】:

然后你把它输入grep到底是怎么回事?【参考方案19】:

其他命令在嵌入式系统上对我不起作用,因为它们需要 bash 或更完整版本的 xargs(busybox 受到限制)。

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

按文件夹列出:

ls $(echo $PATH | tr ':' ' ')

按名称列出所有命令

ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort

【讨论】:

这仍然依赖于tr。为什么不简单地ls $(echo $PATH//:/ ) 这就是我想要的。简单明了【参考方案20】:

或者,您可以获得一个方便的命令列表以及快速描述(只要命令有手册页,大多数情况下):

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

结果似乎没有排序,因此如果您要查找长列表,可以抛出 |排序 |到中间,然后通过管道将它传送到像少/多/大多数这样的寻呼机。阿拉:

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

它会返回名称或简短描述中包含“zip”的所有命令的排序列表,并泵出“less”寻呼机。 (您也可以将“less”替换为 $PAGER 并使用默认寻呼机。)

【讨论】:

以上是关于列出所有可用命令和别名的 Linux 命令的主要内容,如果未能解决你的问题,请参考以下文章

linux基本命令

linux命令基础二

每天一个linux命令

linux文件目录操作常用命令

Linux命令之命令别名

linux中添加自定义命令