如何查找仅具有前缀的二进制名称?

如何查找仅具有前缀的二进制名称?

上下文:我有一个 bash 脚本,它从 MinGW 交叉编译的 DLL 生成 Windows 导入库。作为构建过程的一部分,它运行llvm-dlltool-6.0,因为这恰好是我安装时安装的该工具的特定版本sudo apt-get install -y clang(截至 2019 年 5 月)。但是,我不确定这是否会是将来的版本,我真的不想将脚本与 clang 的版本绑定在一起。

这似乎是 llvm 工具包的一个缺陷。有许多工具带有后缀,但没有与工具名称建立符号链接(我在 中同时拥有llvm-dlltool-6.0和)。llvm-dlltool-8/usr/bin/

在我的系统中,单独修复此问题的正确方法是使用 创建符号链接update-alternatives。但是,我宁愿不要求每个运行构建脚本的人都这样做,也不想每次更新 clang 时都需要不断修复 Dockerfile。

llvm-dlltool有没有一个好的方法(在 bash 脚本中)来查找PATH 中存在的以 开头的最高版本后缀的二进制文件?我可以ls /usr/bin/llvm-dlltool-* | tail -n1,但我不能确定每个用户都已将其安装在该位置(如果用户确实有符号链接,我也希望尊重符号链接llvm-dlltool)。

答案1

您可以列出 $PATH 变量中的所有程序,使用 grep 搜索所需的程序,然后使用以下命令按数字排序:

version=$(echo -e ${PATH//:/\\n} | while read line; do find "$line" -name "llvm-dll*"; done | grep llvm-dll | sed 's/[^0-9]*//' | sort -n | tail -n 1)
whereis $(echo -e ${PATH//:/\\n} | while read line; do find "$line" -name "llvm-dll*"; done | grep llvm-dll | grep $version) | sed 's/.*: \//\//'

whereis 命令将为您提供该命令的用户路径。最后 cut 将仅输出该命令的实际位置。我首先提取了版本号,以便 sort 命令可以单独处理它。否则,llvm-dll-10 将排在 llvm-dll-9 之前

编辑:添加 ls 标志以防止错误。

编辑:使其兼容空间。

相关内容