Мне нужно проверить, является ли номер версии Bash> = для определенного числа. Например у меня есть:
$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Чтобы использовать ассоциативные массивы, номер версии bash должен быть> = 4.
В моем bash-скрипте я хотел бы провести однострочный тест наиболее элегантным / эффективным / читабельным способом, но другие подходы также принимаются.
command-line
bash
scripts
versions
WinEunuuchs2Unix
источник
источник
$BASH_VERSION
и$BASH_VERSINFO
переменные?--version
Первоначальным намерением была общая процедура проверки всех программ путем добавления и проверки выходных данных. Я отредактировал вопрос соответственно.Ответы:
Пытаться:
BASH_VERSINFO
переменная массива только для чтения, члены которой содержат информацию о версии для этого экземпляра bash. Поскольку он был представлен в bash 2.0, он, вероятно, поддерживается всеми версиями bash, с которыми вы столкнетесь. Но, чтобы быть осторожным, мы включаем значение по умолчанию0
для любой более ранней версии bash, для которой эта переменная не установлена.Извлечение информации о версии из других программ
Вы спрашивали о LibreOffice, Python, ядре и т. Д.
LibreOffice создает информацию о версии, которая выглядит следующим образом:
Чтобы извлечь номер версии:
Для питона:
Чтобы получить версию ядра, используйте
uname
:источник
uname -r
"4.9.0-2-amd64", который может тестировать больше, чем мой "4.11.1-041101-generic" с помощью обычного теста bash, когда на самом деле номер моей версии больше.$ python --version
которого возвращаетсяPython 2.7.12
. @ wjandrea-- спасибо за ссылку +1. Возможно, я мог бы составить таблицу всех названных имен программ и минимальных номеров версий. Затем передайте таблицу измененной копии предоставленнойpython
вами ссылки. Посколькуgrub
вы можете вызывать только скомпилированный Python, вы можете подумать, что для этого существует двоичный файл или это возможно в оболочке.Вместо сравнения номеров версий вы можете проверить непосредственно саму функцию.
declare -A
возвращает2
(по крайней мере, в Bash 3.2), если он не распознает-A
, так что проверьте это (он также выводит ошибку):(
declare -A var
также не работает, еслиvar
массив неассоциативен, поэтомуunset
сначала.)Хотя я и не предполагаю, что кто-то собирается делать бэкпорт в Bash, в целом более уместно проверять функции, а не версии. Даже в случае с Bash кто-то может скомпилировать версию с ограниченными функциями ...
Более общий случай тестирования номеров версий состоит из двух частей: 1) как найти правильный номер версии для тестирования и 2) как сравнить его с другим значением.
Первый является более сложным. Многие программы сообщают свой номер версии с флагом командной строки, например
--version
или-v
, но формат вывода отличается, и программный выбор номера версии может быть затруднен. Тогда возникает проблема, возможно, иметь несколько версий одной и той же программы, установленных одновременно.Второе зависит от некоторых знаний о формате номеров версий.
dpkg
можно сравнить номера версий в стиле Debian (которые, я думаю, включают в себя подмножества версий типа semver ):Или просто объединить вышеперечисленное:
источник
Есть несколько способов приблизиться к тому, чего вы хотите достичь.
1. Используйте $ BASH_VERSION
Достаточно просто посмотреть, что в
$BASH_VERSION
переменной. Лично я бы использовал подоболочку так:Обратите внимание, что
<<<
синтаксис для here-doc непереносим, если вы собираетесь использовать его с/bin/sh
Dash в Ubuntu и может быть чем-то другим в другой системе.Альтернативный способ - через оператор case или if. Лично я бы сделал это:
Вероятно, ради переносимости, вы, вероятно, должны проверить, вообще ли вообще установлена такая переменная с чем-то вроде
[ -n $BASH_VERSION ]
Это полностью может быть переписано как функция для использования в скрипте. Что-то длинное строчки:
Это не однострочник, хотя это намного лучше. Качество важнее количества.
2. Проверьте, что установлено
Для этого вам нужно отфильтровать вывод
apt-cache policy
вроде такdpkg-query
может также пригодиться с некоторой фильтрацией черезawk
.Обратите внимание, что это не переносимо, поскольку, если в системе ее нет
dpkg
или онаapt
установлена (например, RHEL или FreeBSD), это не принесет вам пользы.3. Используйте set -e для выхода из скрипта в случае ошибки
Один из способов обойти это - просто использовать ассоциативные массивы и выходить, когда
bash
их нельзя использовать.set -e
строка ниже#!/bin/bash
позволит сценарию выйти, если сценарий не может использовать ассоциативный массив.Это потребует от вас явного указания пользователю: «Эй, вам действительно нужен bash версии 4.3 или выше, иначе скрипт не будет работать». Тогда ответственность ложится на пользователя, хотя некоторые могут утверждать, что это не очень хороший подход к разработке программного обеспечения.
4. Оставь все надежды и напиши переносимые POSIX-совместимые скрипты
bash
Сценарии не переносимы, поскольку их синтаксис не совместим с оболочкой Bourne. Если сценарий, который вы пишете, будет использоваться в различных системах, а не только в Ubuntu, то оставьте все надежды и найдите способы использовать что-то, кроме ассоциативных массивов. Это может включать наличие двух массивов или анализ файла конфигурации. Также рассмотрите возможность перехода на другой язык, Perl или Python, где синтаксис как минимум более переносим, чемbash
.источник
yad --version
возвращает,0.37.0 (GTK+ 3.18.9)
но новые функции в настоящее время0.39
.Однострочно невозможно, но возможен сценарий bash
Я разработал скрипт, который опирается на ответы в Stack Overflow. Один из этих ответов привел к тому, что сотрудник Dell написал в 2004 году сравнение номеров версий для приложения DKMS.
Код
Сценарий bash, указанный ниже, должен быть помечен как исполняемый с помощью команды
chmod a+x script-name
. Я использую имя/usr/local/bin/testver
:источник