上下文:我有一个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。
有没有一种很好的方法(在bash脚本中)找到以路径上的llvm-dlltool开头的最高版本后缀二进制文件?我可以ls /usr/bin/llvm-dlltool-* | tail -n1,但我不能确定每个用户都在那个位置安装了它(如果用户确实有llvm-dlltool符号链接,我也想尊重符号链接)。
发布于 2019-05-08 20:32:00
您可以列出$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命令将为用户提供指向该命令的路径。最后,裁剪只会输出所述命令的实际位置。我首先提取版本号,这样排序命令就可以单独处理它。否则,llvm dll-10将在llvm-dll-9之前排序。
编辑:添加ls标志以防止错误。
编辑:使其空间兼容。
https://askubuntu.com/questions/1141618
复制相似问题