我做了一些研究,但不幸的是我的问题从未得到解答。与我最接近的问题是:搜索 bash 命令
我需要什么:搜索命令已安装使用通配符的命令。假设我想卸载某些东西但忘记了命令。我知道它包含“安装”。所以我会做这样的事情:
searchfor *mount*
找到这unmount
就是我需要的命令。我知道man -k
或者yum whatprovides
。但这不是我要找的。我想搜索所有已安装命令(可以在变量提供的目录中找到$PATH
)。
答案1
我最喜欢的方法是使用compgen -c
.例如,要查找包含以下内容的所有命令mount
:
$ compgen -c | grep mount
gvfs-mount
mmount
ideviceimagemounter
grub-mount
humount
hmount
umount
mountpoint
mount
fusermount
umount
mount.ntfs
mount.lowntfs-3g
mount.cifs
umount.udisks
mount.nfs
umount.nfs
mount
mount.ntfs-3g
mount.fuse
showmount
rpc.mountd
mountesp
umount.udisks2
mountstats
automount
好处是compgen -c
它还可以查找别名、用户函数和 Bash 内置命令,例如:
$ alias aoeuidhtn='echo hi'
$ compgen -c | grep aoeuidhtn
aoeuidhtn
$ my-great-function() { printf "Inside great function()\n"; }
$ compgen -c | grep great
my-great-function
$ compgen -c | grep '^cd$'
cd
此外,compgen
它是 Bash 的一部分,因此始终可用。正如所描述的help compgen
:
根据选项显示可能的完成情况。
旨在在生成可能的完成的 shell 函数内使用。如果提供了可选的 WORD 参数,则会生成针对 WORD 的匹配项。
退出状态:
返回成功,除非提供了无效选项或发生错误。
答案2
#! /bin/bash
s=$1 # e.g. mount
IFS=:
for p in $PATH ; do
ls "$p/"*"$s"* 2>/dev/null
done
设置$IFS
为:
可以for
正确迭代 的成员$PATH
。将 stderr 重定向到 /dev/null 会隐藏不包含匹配项的目录的错误消息。
答案3
它可以通过多种不同的方式完成,在 $PATH 路径中查找,使用locate 命令等。
查找 $(echo $PATH|tr ':' ' ') -max深度 1 -name '*mount*'
答案4
这是基于乔罗巴的回答,但仅使用 Bash 功能(为 GNU Bash 4.3.11 编写)。如果找到任何匹配项,则返回成功,否则返回失败。
#!/bin/bash
shopt -s nullglob
s="${1:?}" # Error if argument is missing or null.
exit=1 # Return failure unless changed.
IFS=:
for p in $PATH; do
for f in "$p/"*"$s"*; do
if [[ -f $f ]]; then
echo "$f"
exit=0 # Return success since match found.
fi
done
done
exit $exit