列出所有可用命令和别名的 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根据与命令关联的关键字列出命令很有用。
使用: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 命令的主要内容,如果未能解决你的问题,请参考以下文章