Как найти двоичное имя только с префиксом?
Контекст: у меня есть скрипт 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 для предотвращения ошибок.
Изменить: сделал это пространство совместимым.