Necesito probar si el número de versión de Bash es> = a un número específico. Por ejemplo tengo:
$ 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 matrices asociativas, el número de versión de bash debe ser> = 4.
En mi script bash, me gustaría poner una prueba de una sola línea de la manera más elegante / eficiente / legible posible, pero también se aceptan otros enfoques.
command-line
bash
scripts
versions
WinEunuuchs2Unix
fuente
fuente
$BASH_VERSION
y$BASH_VERSINFO
?--version
intención original era una rutina genérica para verificar todos los programas agregando y probando el resultado. He editado la pregunta en consecuencia.Respuestas:
Tratar:
BASH_VERSINFO
es una variable de matriz de solo lectura cuyos miembros contienen información de versión para esta instancia de bash. Dado que se introdujo con bash 2.0, es probable que sea compatible con todas las versiones de bash que encontrará. Pero, para ser cautelosos, incluimos un valor predeterminado de0
para cualquier versión anterior de bash para la que esta variable no esté establecida.Extraer información de versión de otros programas
Preguntaste sobre LibreOffice, Python, kernel, etc.
LibreOffice produce información de versión que se parece a:
Para extraer el número de versión:
Para python:
Para obtener la versión del kernel, use
uname
:fuente
uname -r
es "4.9.0-2-amd64", que podría probar más que el mío "4.11.1-041101-generic" con una prueba de bash regular cuando en realidad mi número de versión es mayor.$ python --version
que regresaPython 2.7.12
. @ wjandrea-- gracias por el enlace +1. Tal vez podría construir una tabla de todos los nombres de programas llamados y números mínimos de versión. Luego pase la tabla a una copia modificada delpython
enlace que proporcionó. Debido a que solo Python compilado puede ser llamado porgrub
usted, pensaría que existe un binario para hacer esto o es posible en shell.En lugar de comparar números de versión, puede probar directamente la función en sí.
declare -A
devuelve2
(al menos en Bash 3.2) si no reconoce-A
, así que pruébelo (también imprime un error):(
declare -A var
también falla sivar
es una matriz no asociativa, porunset
lo que primero).Si bien realmente no asumo que alguien va a hacer backport de características en Bash, en general es más apropiado verificar las características, no las versiones. Incluso en el caso de Bash, alguien podría compilar una versión con características limitadas ...
El caso más general de probar números de versión tiene dos partes: 1) cómo encontrar el número de versión correcto para probar, y 2) cómo compararlo con otro valor.
El primero es el más difícil. Muchos programas dicen su número de versión con un indicador de línea de comando como
--version
o-v
, pero el formato de salida varía y elegir el número de versión mediante programación puede ser difícil. Luego está el problema de posiblemente tener varias versiones del mismo programa instaladas al mismo tiempo.El segundo depende de cierto conocimiento del formato de los números de versión.
dpkg
puede comparar los números de versión de estilo Debian (que creo que incluye versiones de tipo semver como subconjunto):O, simplemente para combinar lo anterior:
fuente
Hay dos formas de acercarse a lo que desea lograr.
1. Use $ BASH_VERSION
Es suficiente solo ver lo que hay en la
$BASH_VERSION
variable. Personalmente usaría subshell así:Tenga en cuenta que la
<<<
sintaxis para here-doc no es portátil, si la va a usar/bin/sh
, que es Dash en Ubuntu y podría ser otra cosa en un sistema diferenteLa forma alternativa es a través de la declaración del caso o si la declaración. Personalmente, haría esto:
Probablemente, en aras de la portabilidad, probablemente debería comprobar si dicha variable está configurada en primer lugar con algo como
[ -n $BASH_VERSION ]
Esto se puede reescribir totalmente como una función para usar en un script. Algo largo las líneas de:
Esto no es un trazador de líneas, aunque esto es mucho mejor. Calidad sobre cantidad.
2. Compruebe lo que está instalado
Para eso necesitas filtrar la salida de esta
apt-cache policy
maneradpkg-query
También puede ser útil con algunos filtros a través deawk
.Tenga en cuenta que esto no es portátil, ya que si no hay
dpkg
o estáapt
instalado en un sistema (por ejemplo, RHEL o FreeBSD), no le servirá de nada.3. Use set -e para salir del script si hay un error
Una forma de evitarlo es simplemente usar matrices asociativas y salir cuando
bash
no pueda usarlas.set -e
la línea a continuación#!/bin/bash
permitirá que el script se cierre si el script no puede usar una matriz asociativa.Esto requerirá que le diga explícitamente al usuario: "Oye, realmente necesitas bash versión 4.3 o superior, de lo contrario el script no funcionará". Luego, la responsabilidad recae en el usuario, aunque algunos podrían argumentar que este no es realmente un buen enfoque para el desarrollo de software.
4. Abandone toda esperanza y escriba scripts portátiles compatibles con POSIX
bash
los scripts no son portátiles porque su sintaxis no es compatible con el shell Bourne. Si el script que está escribiendo se va a usar en una variedad de sistemas diferentes, no solo en Ubuntu, abandone toda esperanza y encuentre formas de usar algo más que matrices asociativas. Eso podría incluir tener dos matrices o analizar un archivo de configuración. Considere también cambiar a un idioma diferente, Perl o Python, donde la sintaxis es al menos más portátil quebash
.fuente
yad --version
vuelve0.37.0 (GTK+ 3.18.9)
pero actualmente hay nuevas características0.39
.One-liner no es posible pero es posible un script bash
Desarrollé un script que se basa en respuestas en Stack Overflow. Una de esas respuestas llevó a un empleado de Dell a escribir comparaciones de números de versión en 2004 para la aplicación DKMS.
El código
El script bash a continuación debe marcarse como ejecutable mediante el comando
chmod a+x script-name
. Estoy usando el nombre/usr/local/bin/testver
:fuente