为了在尽可能多的环境中测试一些脚本1 ,我设置了多个使用 UNIX(或类 Unix 操作系统)的虚拟机:
- Linux
- 索拉里斯
- 操作系统X2
- 自由BSD
不过,我认为,在很多方面,使用我计划关心的每个 shell 的不同版本进行测试实际上比使用不同的操作系统进行测试更重要。
由于我不希望我的虚拟机以看似无穷无尽的排列方式倍增,因此我希望在任何给定的虚拟机上安装每个 shell 的多个版本。例如,如果我进行测试,[:bash,:zsh,:fish,:ksh,:csh,:tcsh,:sh,:dash,:ash]
那么我有 9 个 shell,如果你假设我平均测试每个 shell 的 3 个版本,那么我有超过 100 个虚拟机:
# operating_systems * shells * shell_versions
4 * 9 * 3
有没有实用的方法可以在单台计算机或虚拟机上安装和使用给定 shell 的多个版本?我可以(例如)在一台 Linux VM 上安装 Bash 1、Bash 2、Bash 3 和 Bash 4 吗?
我意识到
- 有些组合不太重要,可能可以忽略,并且
- 最终我还想测试每个操作系统的多个版本,
但这些与这个问题确实是分开的,所以我将这些问题放在一边来考虑这是否可能。
所以:有没有实用的方法可以在一台机器上安装和使用给定 shell 的多个版本?
1 我宽松地使用了术语“脚本”。我想要测试的第一件事就是由 shellrc
文件获取的东西,无论是.zshrc
、.bash_profile
或其他什么,所以它不会有自己的 shebang 行。因此,我们希望让一段代码能够在多个 shell 中工作。其他跨 shell 有用的东西是我想在不同机器上使用的函数和别名,尽管它们不一定都有我最喜欢的 shell (Z Shell),但可能会让我使用 Bash 或 Korn。还有我可能想在多台机器上的 shell 脚本中使用的任何有用的片段,即使我无法将我最喜欢的 shell 放在 shebang 行中。
2 完全离题的注释,只是为了不说任何误导性的内容而包含在内:我实际上还没有设置 OS X VM,因为这很麻烦,但我希望这样做,并将其包含在列表中,这样就没有人了会说“嘿!为什么不包括 OS X!?”
答案1
如果您愿意从源代码构建,则可以将每个版本安装到单独的前缀中,然后相应地调整脚本中的路径。
bash、fish、ksh、tcsh、zsh 和 dash 都支持--prefix
配置参数,因此您可以下载每个版本并运行./configure --prefix=/opt/SHELL-VERSION; make; make install
。然后要使用每个版本,请将 PATH 设置/opt/SHELL-VERSION/bin
在前面。
csh 有点不同,需要更多的手动工作;如果您确定需要它,您可以从 FreeBSD 源代码树中提取源代码并编辑 Makefile,但大多数人实际上还是使用 tcsh。
我不认为灰烬有一个规范的来源,但它可能会有类似的处理方式。
答案2
正如 Zanchey 所说,您可以将每个 shell 版本安装到其自己的前缀中。如果你想将它们放在 PATH 中,可以重命名它们并将它们复制到 /usr/bin/。例如:
$ bash1
bash-1.0$ ./myscript.sh
# Code here.
bash-1.0$ bash2
# And so on...
user@user-MacBook-Pro:~$ zsh1
# and again until you finish...
user@user-MacBook-Pro ~> exit
# Don't just skip into shells, or deal with the exit. Or just spam ^D.
$ exit