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


280

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

就像您键入“ a”并按下制表符一样,但是对于字母的每个字母。或运行“别名”,但也返回命令。

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

ListAllCommands | grep searchstr

两次按TAB按钮列出环境中可用的所有命令
ntshetty

Answers:


599

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

  • compgen -c 将列出您可以运行的所有命令。
  • compgen -a 将列出您可以运行的所有别名。
  • compgen -b 将列出您可以运行的所有内置插件。
  • compgen -k 将列出您可以运行的所有关键字。
  • compgen -A function 将列出您可以运行的所有功能。
  • compgen -A function -abck 一口气列出以上所有内容。

检查手册页以了解可以生成的其他完成内容。

要直接回答您的问题:

compgen -ac | grep searchstr

应该做你想做的。


1
csh / tcsh是否具有与此等效的功能?这些终端还具有在选项卡上使用的某种自动完成功能,因此可能存在某些内容吗?
krb686

2
代替compgen | grep,将字符串作为参数传递给compgen自身(如果已知为前缀,如问题中所暗示的那样)会更有效。在这种情况下,该值为compgen -ac searchstr
Toby Speight

实际上,ubuntu的表示“无适当”,whatis compgen而表示“无手动输入” man compgen
MarAvFe

1
@MarAvFe:这是因为它是bash内置命令,而不是带有自己的手册页的单独命令。您需要阅读bash(1)手册页或help compgenbash命令行中运行。
camh '17

通过扩展,doing compgen -c | sort | uniq | less将打印所有可用命令,而不重复行并按字母顺序排序。
法比安

39

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

这非常接近,但不包括别名。如何追加别名| 将-f1剪切到结果但在排序之前?
确认

1
如果唯一的目的是无论如何都要通过grep放置输出,为什么还要打扰排序呢?Unix的哲学是制造简单的工具,然后根据需要将它们链接在一起,因此将sortAllCommands排除在外,如果用户希望对输出进行排序,他们可以做到这一点。
danio

4
排序是删除重复项。
蚂蚁阿斯玛

1
找不到与可执行文件符号链接的命令。使用-Lon 选项可将符号链接跟随到其目的地。注意:-L是一个选项,而不是匹配表达式的一部分,因此必须将其放置在命令行中的路径之前。在这种情况下find -L {}
Adaephon 2014年

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 2015年

27

type -a mycommand

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


1
即使不是解决问题的方法,我也认为这是对grep的更好解决方案。因此,您可以键入-a foo,如果foo不可用,它将返回找不到命令或类似的命令。因此,您无需调用命令本身即可检查命令。
Janusz,2009年

1
实际上,这是对问题的答案,因为OP会问“我想运行以下命令,看看命令是否可用”,所以目的是查看命令是否可用,并且此答案显然有效。
lothar

2
@lothar,如果您要查找的命令是什么,呃,它是什么,“ startserver”,“ serverstart”,“ server-something-other-other”?我知道,我只对服务器使用“ grep -i”,看看它是否在那里。哎呀。Bzzz,不是这个解决方案。matey :-)我不会否决这个答案(因为即使以有限的方式也很有用),但是完整的解决方案将考虑到grep用于正则表达式,而不仅仅是固定字符串。
paxdiablo

6

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

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

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

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


6

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

以下命令应在任何类似Unix的系统上运行。

按文件夹列出:

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

按名称列出所有命令

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

这仍然依赖tr。为什么不简单ls $(echo ${PATH//:/ })
mschilli

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

到目前为止,这是唯一针对所有命令执行的代码解决方案,而不仅仅是查看给定的已知命令是否存在。+1。
paxdiablo

3

对于Mac用户(find不具有-executable,xargs不具有-d):

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

谢谢你 我实际上使用的是@AntsAasma答案不起作用的非Mac Unix。这在Mac和UNIX上也适用于我。我可以输入什么命令来确定我所使用的unix版本,因此我可以在此处回复以帮助他人解决我的问题?
aticaticorb

的Linux <corporate_proprietary_build_info_here>周一年12月12 13时34分16秒EST 2011 x86_64的x86_64的x86_64的GNU / Linux的
prismaticorb

3

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

采用: man -k "your keyword"

随时与以下内容结合使用:| grep "another word"

例如,找到一个文本编辑器: man -k editor | grep text



2

这是一个解决方案,可为您提供所有可执行文件别名的列表。它也可以移植到没有系统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

2

列出所有命令的快捷方式。打开终端并按两次“选项卡”按钮。多数民众赞成在终端中显示所有命令


1
然后您将其grep准确地传送到?
Toby Speight

2

另外,您可以获取方便的命令列表以及快速描述(只要命令具有手册页即可,大多数情况下都可以这样做):

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”寻呼机。(您也可以用$ PAGER替换“ less”并使用默认的寻呼机。)


1

您可以随时执行以下操作:

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

无论如何,shell只会在路径env var中列出命令时才执行命令。


1

这取决于我的意思,这取决于您所使用的外壳。这是我看到的约束:

  1. 必须与外壳程序在同一进程中运行,以捕获会影响您可以找到的命令的别名,函数和变量,尽管EDITOR可能不在范围之内,但请考虑使用PATH或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,则应该这样做。


0

问题是制表符补全正在搜索您的路径,但是所有命令都不在您的路径中。

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

为x in echo $PATH | cut -d":" -f1; 做ls $ x; 做完了


0

您可以在bashrc文件中放入以下函数:

功能命令搜索
{
   oldIFS = $ {IFS}
   IFS =“:”

   用于$ {PATH}中的p
   做
      ls $ p | grep $ 1
   做完了

   导出IFS = $ {oldIFS}
}

用法示例:

$命令搜索gnome
gnome-audio-profiles-属性*
gnome-eject @
侏儒钥匙扣*
gnome-keyring-daemon *
侏儒山*
侏儒开放*
侏儒录音机*
gnome-text-editor @
gnome-umount @
gnome-音量控制*
polkit-gnome-授权*
vim.gnome *
$

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

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


-1

也许我误会了,但是如果您按Escape键直到显示Display X怎么办?


-2
compgen -c > list.txt && wc list.txt

1
考虑添加有关此功能或应如何工作的简要说明。至少要指定一个参考链接(通常是相关的手册页)以跟进并理解所提出的解决方案。
TheCodeArtist 2015年

使用文件并不总是一个好的选择。如果确实需要,请至少将其制成tmp文件(如果安全性不是问题。)compgen -c > /tmp/list.txt && /tmp/wc list.txt
2015年

-3

为什么不输入:

seachstr

在终端。

贝壳会说一些像

seacrhstr: command not found 

编辑:

好的,我赞成,因为答案很愚蠢,我只想知道:这个答案有什么问题!!!询问者说:

并查看命令是否可用。

键入命令将告诉您该命令是否可用!

可能他/她的意思是“不执行命令”“将其包括在脚本中”,但我无法读懂他的想法(不是我不能定期地仅仅是因为他戴着 思想阅读器


4
我想知道formathdd命令是否存在。哦,等等,我只是运行它看看。哎呀 谢谢:)
杰弗里·何塞

5
使用“哪个”来做到这一点可能更安全。
danio 2010年

鉴于这是Stack Overflow而不是Super User,因此以编程方式回答会更合适。
Toby Speight

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.