如何在一台機器上運行一個 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 的方法。

相關內容