Obwohl es schön ist zu wissen, dass es möglich ist, beliebige Versionen von Bash lokal zu kompilieren (wie in meiner anderen Antwort besprochen), gibt es heutzutage eine viel einfachere Option – den offiziellen Docker bash
Bilder.
Ein Skript gegen mehrere Bash-Versionen zu testen ist oft so einfach wie:
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
Um abschließend auf diese Frage zurückzukommen:Es ist ziemlich einfach, die Bash-Version(en), an denen Sie interessiert sind, einfach zu kompilieren (ohne zu installieren). So teste ich 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.
Jetzt haben Sie eine Bash 3.2.57-Binärdatei, die Sie ausführen können, ohne sie tatsächlich zu "installieren" oder Ihre normale Umgebung zu ändern.
So führen Sie ein Shell-Skript für diese Version aus:
$ ./bash your_script.sh
So geben Sie eine saubere interaktive Eingabeaufforderung ein:
$ 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$
Mit env -i
statt nur ./bash
anzurufen hinterlässt direkt eine größtenteils leere Umgebung (führen Sie env
aus aus dem Inneren der Schale, um zu sehen, was noch eingestellt ist). Aktualisieren von PATH
erlaubt Aufrufe an bash
(zB bash -version
), um die lokale Bash-Shell aufzurufen, nicht die systemweite Installation (beachten Sie jedoch, dass dies Ihren gesamten PATH einzieht). Hinzufügen von --noprofile --norc
vermeidet das Laden Ihres .bashrc
und zugehörige Skripte.
Wenn Sie keine PATH
abholen möchten Änderungen führen Sie einfach export PATH="$PWD:$PATH"
aus einmal innerhalb der Subshell statt als Teil von env
Befehl.
Ich habe ein Docker-Image (Repo), das diese Installationsschritte verwendet, falls dies hilfreich ist, damit die Leute darauf verweisen können. Ich würde nicht unbedingt vorschlagen, dieses Image direkt zu verwenden, aber Sie können es gerne aus dem Dockerfile/install-Skript kopieren. MIT-lizenziert.
Schauen Sie sich shenv an:https://github.com/shenv/shenv. Genau wie rbenv, pyenv, goenv und andere, aber für Shells können Sie damit verschiedene Versionen von Bash installieren (zsh, fish, yash usw.).
(Haftungsausschluss:Ich bin derjenige, der pyenv in shenv geforkt hat!)