Как найти двоичное имя только с префиксом?

Контекст: у меня есть скрипт 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 символическая ссылка).

2
задан 9 May 2019 в 07:58

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 для предотвращения ошибок.

Редактировать: Сделано это совместимым с пространством.

0
ответ дан 9 May 2019 в 07:58

Другие вопросы по тегам:

Похожие вопросы: