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

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

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

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

ListAllCommands | grep searchstr

【问题讨论】:

  • 按两次 TAB 键列出环境可用的所有命令
  • 参见this answercompgen

标签: linux command-line terminal


【解决方案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】:

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

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

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

              1. 转储路径
              2. 转储别名
              3. 转储环境中的函数
              4. 对它们进行排序

              这里是:

              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 并使用默认寻呼机。)

                  【讨论】:

                    猜你喜欢
                    • 2014-04-05
                    • 1970-01-01
                    • 2015-03-21
                    • 2020-03-29
                    • 1970-01-01
                    • 2021-12-10
                    • 2017-02-15
                    • 2020-04-24
                    • 1970-01-01
                    相关资源
                    最近更新 更多