如何在一台机器上运行一个 shell 的多个版本

如何在一台机器上运行一个 shell 的多个版本

为了在尽可能多的环境中测试一些脚本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 吗?

我意识到

  1. 有些组合不太重要,可能可以忽略,并且
  2. 最终我还想测试每个操作系统的多个版本,

但这些与这个问题确实是分开的,所以我将这些问题放在一边来考虑这是否可能。

所以:有没有实用的方法可以在一台机器上安装和使用给定 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

答案3

阿斯达夫专门设计用于“使用单个 CLI 工具管理多个运行时版本”,无论该运行时是语言、shell 还是其他什么。它有一个Zsh 插件,所以这应该比滚动您自己的解决方案方便得多。

更新 虽然asdf可能更方便,但它没有针对所有提到的 shell 的插件,所以我建议使用 Zanchey 的方法。

相关内容