是否可以模拟旧版本的 Bash?

是否可以模拟旧版本的 Bash?

是否可以模拟(这个词正确吗?)以前版本的 Bash?

我使用的是 4.3.11,我很想知道我的脚本是否与某些早期版本兼容,但我不想实际安装早期版本。我可以深入研究变更日志并找出我正在使用的以前版本缺少的功能,但这似乎有点乏味。我希望有某种神奇的命令行选项或脚本命令(可能是一厢情愿的想法)。

答案1

不,bash 无法模拟旧版本的 bash。但是设置一个包含旧版本 bash 的测试环境非常容易。

如果您必须手动安装每个软件包,那么安装各个软件的旧版本是很乏味的,更不用说解决库不兼容的问题了。但有一个更简单的解决方案:安装旧版本分配。安装较旧的发行版以及一套一致的软件(包括开发包)大约需要花费 1 美元的硬盘空间,并且首次安装可能需要一个小时。

施鲁特软件包可以轻松安装与普通 Linux 系统在同一系统上运行的较旧(或较新!)的 Linux 发行版。您可以轻松地进行 schroot 设置,在其中可以在环境(achroot)其中系统目录指向较旧的软件,但主目录是正常环境的目录。我写基于 Debian 的发行版指南;您可以通过这种方式轻松返回 Debian slink(使用 bash 2.01.01)。

如果您想使用不同的 Unix 变体、不同的 CPU 架构或非常非常旧的软件进行测试,您可以在虚拟机中运行其他操作系统。虽然会产生更多的开销(RAM、磁盘空间、CPU 和维护),但它仍然非常可行。

答案2

您可以轻松地在 docker 容器中测试任何版本的 bash。

你可以启动一个运行 bash 3.2 的 docker 容器,如下所示:

$ docker run -it bash:3.2 

您可以在 docker 中挂载一个文件夹,这样您就可以轻松地在 docker 容器中测试您机器上的脚本。以下内容将允许该文件夹/Users/myuser在 docker 容器中可用:/myuser

$ docker run -v /Users/myuser/:/myuser -it bash:3.2 

请注意,您可以使用此处列出的任何 bash 版本:

https://hub.docker.com/_/bash

这些图像的来源可以在这里找到:

https://github.com/tianon/docker-bash/

答案3

以符合 POSIX 的方式编写脚本,然后使用完全不同的 shell 进行测试,例如dashzshpdksh您拥有的其他 shell。避免 shell 语言的暗角和灰色区域;以“规范”的方式做一切。

当然,这并不能证明您的代码没有遇到旧版本中的某些 Bash bug,但它提高了信心。一方面,Bash bug 更有可能在 Bash 特定的构造(可移植脚本不执行)以及那些黑暗角落和灰色区域(许多脚本不执行)中发现。

换句话说,不要成为世界上第一个进行四重反向评估的 shell 脚本编写者。

使脚本可移植的好处之一是,假设用户确实发现您的脚本在其安装的较旧 Bash 中不起作用。好吧,由于该脚本不是 Bash 特定的,也许他们可以让它与另一种 shell 一起工作,并且他们已经安装了一个 shell。

只有两种方法可以了解您的代码是否遇到了某些历史性的 Bash 特定错误。这些方法中只有一种是半可靠的(您不想做的一种:拉出旧版本的 Bash 并进行测试)。另一种方法是仔细研究 Bash 更改历史记录,并尝试确定您关心的任何旧版本中存在的错误是否可能会影响您的脚本正在执行的操作。

我只会保留一个虚拟机来托管一些较旧的发行版,并时不时地对其进行回归测试。

相关内容