How can I test my Bash script on older versions of Bash? How can I test my Bash script on older versions of Bash? linux linux

How can I test my Bash script on older versions of Bash?


Finally coming back to this question, it's pretty easy to just compile (without installing) the bash version(s) you're interested in. Here's how I'm testing 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 -versionGNU bash, version 3.2.57(1)-release (armv7l-unknown-linux-gnu)Copyright (C) 2007 Free Software Foundation, Inc.

Now you have a bash 3.2.57 binary you can run, without actually "installing" it or modifying your normal environment.

To run a shell script against this version:

$ ./bash your_script.sh

To enter a clean interactive prompt:

$ env -i PATH="$PWD:$PATH" ./bash --noprofile --norcbash-3.2$ bash -versionGNU bash, version 3.2.57(1)-release (armv7l-unknown-linux-gnu)Copyright (C) 2007 Free Software Foundation, Inc.bash-3.2$ 

Using env -i rather than just calling ./bash directly leaves you with a mostly-empty environment (run env from inside the shell to see what's still set). Updating the PATH allows calls to bash (e.g. bash -version) to invoke the local bash shell, not the system-wide installation (but note this pulls in your whole PATH). Adding --noprofile --norc avoids loading your .bashrc and associated scripts.

If you don't want to pick up any PATH modifications, just execute export PATH="$PWD:$PATH" once inside the subshell instead of as part of the env command.


I have a Docker image (repo) using these installation steps, if that's helpful for folks to reference. I wouldn't necessarily suggest using this image directly, but you're welcome to copy from the Dockerfile/install script. MIT licensed.


Although it's nice to know that it's possible to compile arbitrary versions of bash locally (as discussed in my other answer), these days there's a much simpler option - the official Docker bash images.

To test a script against multiple bash versions is often as simple as:

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.shdone


Have a look at shenv: https://github.com/shenv/shenv. Just like rbenv, pyenv, goenv and others, but for shells, it lets you install different versions of Bash among others (zsh, fish, yash, etc.).

(Disclaimer: I'm the one who forked pyenv into shenv!)