linux - 如何在旧版本的 Bash 上测试我的 Bash 脚本?

标签 linux bash integration-testing versioning

我正在开发一个 Bash 库,并希望确保我支持尽可能多的环境——包括 Bash 的旧安装。我的开发环境是 Bash 4.3,但我的一些用户可能运行的是更旧的版本,目前我无法确认或否认我的库是否适用于他们。特别是我想与 OSX 兼容(它仍然随附 Bash 3.2,AFAIK)。

我知道 Bash 可以在 POSIX 兼容模式下运行;是否有类似的设置来禁用现代功能?或者以某种兼容模式运行 Bash 的方法?除了实际查找和启动旧操作系统并在那里测试我的库之外,我正在寻找任何技术。

更新

例如,我避免使用 associative arrays因为它们是在 Bash 4 中引入的,但是如果不进行测试就很难确定我没有不小心使用了其他 Bash 4+ 功能。

最佳答案

最后回到这个问题,编译(无需安装)bash version(s) 非常容易你感兴趣。这是我测试 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.

现在您有一个可以运行的 bash 3.2.57 二进制文件,无需实际“安装”它或修改您的正常环境。

针对此版本运行 shell 脚本:

$ ./bash your_script.sh

输入clean interactive prompt :

$ 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$ 

使用 env -i 而不是直接调用 ./bash 会留下一个几乎是空的环境(从内部运行 env shell 以查看仍然设置的内容)。更新 PATH 允许调用 bash(例如 bash -version)来调用本地 bash shell,而不是系统范围的安装(但请注意这会拉入你的整个路径)。添加 --noprofile --norc 可避免加载您的 .bashrc 和相关脚本。

如果您不想获取任何 PATH 修改,只需在子 shell 中执行一次 export PATH="$PWD:$PATH" 而不是作为一部分env 命令。


我有一个 Docker image ( repo ) 使用这些安装步骤,如果这对人们引用有帮助的话。我不一定建议直接使用此图像,但欢迎您从 Dockerfile/install 脚本中复制。 MIT 许可。

关于linux - 如何在旧版本的 Bash 上测试我的 Bash 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34805372/

相关文章:

linux - 如何在linux ssh上执行脚本...?

Bash:sed实现

用于检查未设置和空白变量的 Bash 函数

java - inmemdb-maven-plugin 和 maven-failsafe-plugin 数据库表创建问题

linux - 如何在后台一条一条运行命令?

c++ - g++ 中的错误 "cannot appear in a constant-expression"但 gcc 中没有

docker - 如何使用 docker-compose 快速恢复新数据库以进行集成测试?

c# - 使用 Unity IoC 进行 MVC 集成测试

python - 如何安装pygame字体

linux - Eclipse 不使用 .bashrc 中设置的路径