Aunque es bueno saber que es posible compilar localmente versiones arbitrarias de bash (como discutí en mi otra respuesta), en estos días hay una opción mucho más simple:el Docker oficial bash
imágenes.
Para probar un script contra múltiples versiones de bash es a menudo tan simple como:
for v in 3 4 5; do # or whatever versions you're interested in
docker run -v "$PWD:/mnt" "bash:$v" \
bash /mnt/your_script.sh
done
Finalmente, volviendo a esta pregunta, es bastante fácil simplemente compilar (sin instalar) las versiones de bash que le interesan. Así es como estoy probando Bash 3.2.57:
$ mkdir ~/bash
$ cd ~/bash
$ wget http://ftp.gnu.org/gnu/bash/bash-3.2.57.tar.gz
$ tar xvzf bash-3.2.57.tar.gz
$ cd bash-3.2.57
$ ./configure
$ make
# if `make` fails due to yacc, run `sudo apt-get install byacc`
# No need to run `make install`
$ ./bash -version
GNU bash, version 3.2.57(1)-release (armv7l-unknown-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
Ahora tiene un binario bash 3.2.57 que puede ejecutar sin "instalarlo" ni modificar su entorno normal.
Para ejecutar un script de shell en esta versión:
$ ./bash your_script.sh
Para ingresar un indicador interactivo limpio:
$ env -i PATH="$PWD:$PATH" ./bash --noprofile --norc
bash-3.2$ bash -version
GNU bash, version 3.2.57(1)-release (armv7l-unknown-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
bash-3.2$
Usando env -i
en lugar de simplemente llamar a ./bash
te deja directamente con un entorno mayormente vacío (ejecuta env
desde el interior del caparazón para ver lo que todavía está configurado). Actualizando el PATH
permite llamadas a bash
(por ejemplo, bash -version
) para invocar el shell bash local, no la instalación de todo el sistema (pero tenga en cuenta que esto atrae toda su RUTA). Agregando --noprofile --norc
evita cargar tu .bashrc
y guiones asociados.
Si no quieres recoger ningún PATH
modificaciones, simplemente ejecute export PATH="$PWD:$PATH"
una vez dentro de la subcapa en lugar de como parte del env
comando.
Tengo una imagen de Docker (repo) usando estos pasos de instalación, si eso es útil para que la gente haga referencia. No sugeriría necesariamente usar esta imagen directamente, pero puede copiarla desde el script Dockerfile/install. Licencia MIT.
Echa un vistazo a shenv:https://github.com/shenv/shenv. Al igual que rbenv, pyenv, goenv y otros, pero para shells, te permite instalar diferentes versiones de Bash entre otras (zsh, fish, yash, etc.).
(Descargo de responsabilidad:¡soy yo quien transformó pyenv en shenv!)