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_VERSIONy$BASH_VERSINFO?--versionintenció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_VERSINFOes 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 de0para 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 -res "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 --versionque 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 delpythonenlace que proporcionó. Debido a que solo Python compilado puede ser llamado porgrubusted, 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 -Adevuelve2(al menos en Bash 3.2) si no reconoce-A, así que pruébelo (también imprime un error):(
declare -A vartambién falla sivares una matriz no asociativa, porunsetlo 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
--versiono-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.
dpkgpuede 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_VERSIONvariable. 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 policymaneradpkg-queryTambié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
dpkgo estáaptinstalado 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
bashno pueda usarlas.set -ela línea a continuación#!/bin/bashpermitirá 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
bashlos 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 --versionvuelve0.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