Контекст: у меня есть скрипт bash, который генерирует библиотеку импорта Windows из кросс-скомпилированной библиотеки MinGW. Как часть процесса сборки, он запускается llvm-dlltool-6.0
, потому что это определенная версия того инструмента, который был установлен, когда я sudo apt-get install -y clang
(по состоянию на май 2019 года). Тем не менее, я не уверен, что это будет версия в будущем, и я действительно предпочел бы не привязывать сценарий к версии clang.
Это, кажется, недостаток в пакете инструментов llvm. Есть много инструментов, которые имеют суффикс и не связаны с именем инструмента (у меня есть llvm-dlltool-6.0
и llvm-dlltool-8
в /usr/bin/
).
Правильный способ исправить это для моей системы в ее одиночестве - просто создать символические ссылки, используя update-alternatives
. Однако я бы предпочел не требовать, чтобы все, кто запускает скрипт сборки, делал это, и при этом я не хочу постоянно нуждаться в исправлении Dockerfile каждый раз, когда обновляется clang.
Есть ли хороший способ (в скрипте bash) найти двоичный файл с наивысшей версией, начинающийся с llvm-dlltool
, который существует в PATH? Я могу ls /usr/bin/llvm-dlltool-* | tail -n1
, но я не могу быть уверен, что каждый пользователь установил его в этом месте (также я хотел бы уважать символические ссылки, если у пользователя действительно есть llvm-dlltool
символическая ссылка).
Вы можете перечислить все программы в переменной $ 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 для предотвращения ошибок.
Редактировать: Сделано это совместимым с пространством.