Anche se è bello sapere che è possibile compilare localmente versioni arbitrarie di bash (come discusso nell'altra mia risposta), in questi giorni c'è un'opzione molto più semplice:il Docker ufficiale bash
immagini.
Testare uno script su più versioni di bash è spesso semplice come:
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
Infine, tornando a questa domanda, è piuttosto semplice compilare (senza installare) le versioni di bash che ti interessano. Ecco come sto testando 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.
Ora hai un binario bash 3.2.57 che puoi eseguire, senza effettivamente "installarlo" o modificare il tuo normale ambiente.
Per eseguire uno script di shell su questa versione:
$ ./bash your_script.sh
Per inserire un prompt interattivo pulito:
$ 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
invece di chiamare semplicemente ./bash
ti lascia direttamente con un ambiente per lo più vuoto (esegui env
dall'interno del guscio per vedere cosa è ancora impostato). Aggiornamento del PATH
consente chiamate a bash
(ad es. bash -version
) per richiamare la shell bash locale, non l'installazione a livello di sistema (ma nota che questo inserisce l'intero PERCORSO). Aggiunta di --noprofile --norc
evita di caricare il tuo .bashrc
e script associati.
Se non vuoi ritirare nessun PATH
modifiche, basta eseguire export PATH="$PWD:$PATH"
una volta all'interno della subshell invece che come parte del env
comando.
Ho un'immagine Docker (repo) che utilizza questi passaggi di installazione, se è utile per le persone a cui fare riferimento. Non suggerirei necessariamente di utilizzare questa immagine direttamente, ma puoi copiarla dallo script Dockerfile/install. Licenza MIT.
Dai un'occhiata a shenv:https://github.com/shenv/shenv. Proprio come rbenv, pyenv, goenv e altri, ma per le shell, ti consente di installare diverse versioni di Bash tra le altre (zsh, fish, yash, ecc.).
(Disclaimer:sono io che ho biforcato pyenv in shenv!)