Bien qu'il soit bon de savoir qu'il est possible de compiler localement des versions arbitraires de bash (comme indiqué dans mon autre réponse), il existe aujourd'hui une option beaucoup plus simple - le Docker officiel bash
images.
Tester un script sur plusieurs versions de bash est souvent aussi simple que :
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
Enfin, pour revenir à cette question, il est assez facile de simplement compiler (sans installer) la ou les versions de bash qui vous intéressent. Voici comment je teste 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.
Vous avez maintenant un binaire bash 3.2.57 que vous pouvez exécuter, sans réellement "l'installer" ou modifier votre environnement normal.
Pour exécuter un script shell sur cette version :
$ ./bash your_script.sh
Pour saisir une invite interactive propre :
$ 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$
Utilisation de env -i
plutôt que d'appeler simplement le ./bash
vous laisse directement avec un environnement presque vide (exécutez env
de l'intérieur de la coque pour voir ce qui est encore défini). Mise à jour du PATH
autorise les appels au bash
(par exemple bash -version
) pour appeler le shell bash local, pas l'installation à l'échelle du système (mais notez que cela récupère tout votre PATH). Ajout de --noprofile --norc
évite de charger votre .bashrc
et les scripts associés.
Si vous ne souhaitez pas récupérer de PATH
modifications, exécutez simplement export PATH="$PWD:$PATH"
une fois à l'intérieur du sous-shell au lieu de faire partie du env
commande.
J'ai une image Docker (repo) utilisant ces étapes d'installation, si cela est utile pour les gens. Je ne suggérerais pas nécessairement d'utiliser cette image directement, mais vous pouvez copier à partir du script Dockerfile/install. Licence MIT.
Jetez un œil à shenv :https://github.com/shenv/shenv. Tout comme rbenv, pyenv, goenv et autres, mais pour les shells, il vous permet d'installer différentes versions de Bash entre autres (zsh, fish, yash, etc.).
(Avertissement :c'est moi qui ai transformé pyenv en shenv !)