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

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

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

Изменить: сделал это пространство совместимым.

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