我想查找所有名称为“gcc”、“gcc-4.2”、“gcc-4.9”等的程序。
为了查找我尝试过的所有二进制文件which -a gcc*
。
但是“*”在命令中不被识别为‘任何’ which
。
有没有办法通过模式匹配来找到 PATH 环境变量中的所有程序?
答案1
有一个BASH
内置命令compgen
可用于列出所有命令,功能,别名和内置。
compgen -abck | grep "gcc"
参数:help compgen
compgen:
[-abcdefgjksuv]
[-o option]
[-A action]
[-G globpat]
[-W wordlist]
[-F function]
[-C command]
[-X filterpat]
[-P prefix]
[-S suffix]
[word]
答案2
这是一个快速而粗糙的示例脚本,可以在实践中完成您想要的操作:
#!/bin/sh
IFS=:
for i in $PATH; do
for j in "$i"/$1; do
[ -f "$j" ] && [ -x "$j" ] && printf '%s\n' "$j"
done
done
将其保存为 egwhichglob
并使其可执行。示例运行:
$ echo $PATH
/usr/local/bin:/usr/bin:/bin
$ ./whichglob grep*
/usr/bin/grepdiff
/usr/bin/grep-excuses
/usr/bin/grepjar
/bin/grep
which
实际上, ( 、退出状态、多个文件匹配输入)中的所有功能-a
都可以轻松地添加到这个 shell 脚本上下文中,但我将其留给读者作为练习。