Preciso testar se o número da versão do Bash é> = para um número específico. Por exemplo, eu tenho:
$ 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.
Para usar matrizes associativas, o número da versão do bash deve ser> = 4.
No meu script bash, eu gostaria de fazer um teste de uma linha da maneira mais elegante / eficiente / legível possível, mas outras abordagens também são aceitas.
command-line
bash
scripts
versions
WinEunuuchs2Unix
fonte
fonte
$BASH_VERSION
e$BASH_VERSINFO
?--version
e testando a saída era a intenção original. Eu editei a pergunta de acordo.Respostas:
Experimentar:
BASH_VERSINFO
é uma variável de matriz somente leitura cujos membros mantêm informações de versão para esta instância do bash. Desde que foi introduzido no bash 2.0, provavelmente é suportado por todas as versões do bash que você encontrará. Mas, para ser cauteloso, incluímos um valor padrão de0
para qualquer versão anterior do bash para a qual essa variável não esteja definida.Extraindo informações de versão de outros programas
Você perguntou sobre o LibreOffice, Python, kernel, etc.
O LibreOffice produz informações de versão parecidas com:
Para extrair o número da versão:
Para python:
Para obter a versão do kernel, use
uname
:fonte
uname -r
é "4.9.0-2-amd64", que pode ser maior que o meu "4.11.1-041101-genérico" com um teste de bash regular quando, na realidade, meu número de versão é maior.$ python --version
qual retornaPython 2.7.12
. @ wjandrea-- obrigado pelo link +1. Talvez eu pudesse criar uma tabela com todos os nomes de programas chamados e números mínimos de versão. Em seguida, passe a tabela para uma cópia modificada dopython
link que você forneceu. Como apenas o Python compilado pode ser chamado porgrub
você, você acha que existe um binário para fazer isso ou é possível no shell.Em vez de comparar números de versão, você pode testar diretamente o próprio recurso.
declare -A
retorna2
(pelo menos no Bash 3.2) se não reconhecer-A
, então teste isso (ele também imprime um erro):(
declare -A var
também falha sevar
for uma matriz não associativa, portantounset
, primeiro.)Embora eu realmente não assuma que alguém vai fazer o backport de recursos no Bash, em geral é mais apropriado verificar os recursos, não as versões. Mesmo no caso de Bash, alguém pode compilar uma versão com apenas recursos limitados ...
O caso mais geral de testar números de versão possui duas partes: 1) como encontrar o número de versão correto para testar e 2) como compará-lo com outro valor.
O primeiro é o mais difícil. Muitos programas informam o número da versão com um sinalizador de linha de comando como
--version
ou-v
, mas o formato de saída varia e a escolha programada do número da versão pode ser difícil. Depois, há o problema de possivelmente ter várias versões do mesmo programa instaladas ao mesmo tempo.O segundo depende de algum conhecimento do formato dos números de versão.
dpkg
pode comparar números de versão no estilo Debian (que eu acho que inclui versões do tipo semver como subconjunto):Ou, apenas para combinar o acima:
fonte
Existem algumas maneiras de abordar o que você deseja alcançar.
1. Use $ BASH_VERSION
É suficiente apenas ver o que está na
$BASH_VERSION
variável. Pessoalmente, eu usaria o subshell assim:Observe que a
<<<
sintaxe do here-doc não é portátil, se você a usar/bin/sh
, que é o Dash no Ubuntu e pode ser outra coisa em um sistema diferenteA maneira alternativa é via declaração de caso ou declaração de caso. Pessoalmente, eu faria isso:
Provavelmente, por uma questão de portabilidade, você provavelmente deve verificar se essa variável está definida, em primeiro lugar, com algo como
[ -n $BASH_VERSION ]
Isso totalmente pode ser reescrito como função a ser usada em um script. Algo longo as linhas de:
Esta não é uma linha, embora isso seja muito melhor. Qualidade acima de quantidade.
2. Verifique o que está instalado
Para isso, você precisa filtrar a saída da
apt-cache policy
mesma formadpkg-query
também pode ser útil com alguns filtros viaawk
.Observe que isso não é portátil, pois se não houver
dpkg
ou estiverapt
instalado em um sistema (por exemplo, RHEL ou FreeBSD), não fará nenhum bem.3. Use set -e para sair do script se houver um erro
Uma maneira de contornar isso é simplesmente ir em frente e usar matrizes associativas e sair quando
bash
não puder usá-las.set -e
A linha abaixo#!/bin/bash
permitirá que o script seja encerrado se o script não puder usar matriz associativa.Isso exigirá que você informe explicitamente ao usuário: "Ei, você realmente precisa do bash versão 4.3 ou superior, caso contrário, o script não funcionará". A responsabilidade é do usuário, embora alguns possam argumentar que essa não é realmente uma boa abordagem para o desenvolvimento de software.
4. Abandone toda a esperança e escreva scripts portáteis, compatíveis com POSIX
bash
scripts não são portáveis porque sua sintaxe não é compatível com o shell Bourne. Se o script que você está escrevendo for usado em uma variedade de sistemas diferentes, não apenas no Ubuntu, abandone toda a esperança e encontre maneiras de usar algo diferente de matrizes associativas. Isso pode incluir ter duas matrizes ou analisar um arquivo de configuração. Considere também mudar para uma linguagem diferente, Perl ou Python, onde a sintaxe é pelo menos mais portátil quebash
.fonte
yad --version
retorna,0.37.0 (GTK+ 3.18.9)
mas novos recursos estão no momento0.39
.One-liner não é possível, mas é possível um script bash
Eu desenvolvi um script que se baseia em respostas no Stack Overflow. Uma dessas respostas levou a um funcionário da Dell escrevendo comparações de números de versão em 2004 para o aplicativo DKMS.
O código
O script bash abaixo das necessidades a ser marcado como executável usando o comando
chmod a+x script-name
. Estou usando o nome/usr/local/bin/testver
:fonte