как запустить несколько версий одной оболочки на одной машине

как запустить несколько версий одной оболочки на одной машине

Чтобы протестировать некоторые скрипты 1 в максимально возможном количестве сред, я настроил несколько виртуальных машин с UNIX (или Unix-подобными операционными системами):

  • Линукс
  • Солярис
  • ОС X2
  • FreeBSD

Однако я предполагаю, что во многих отношениях на самом деле важнее проводить тестирование с использованием разных версий каждой оболочки, с которой я планирую работать, чем тестировать с использованием разных операционных систем.

Поскольку я предпочитаю не размножать свои виртуальные машины в, казалось бы, бесконечных перестановках, я бы хотел установить несколько версий каждой оболочки на любой данной виртуальной машине. Например, если я тестирую под, [:bash,:zsh,:fish,:ksh,:csh,:tcsh,:sh,:dash,:ash]то у меня будет 9 оболочек, а если предположить, что я тестирую в среднем по 3 версии каждой, то у меня будет более 100 виртуальных машин:

# operating_systems * shells * shell_versions
            4       *   9    *     3

Есть ли какой-либо практический способ установки и использования нескольких версий данной оболочки на одной машине или виртуальной машине? Могу ли я (например) установить Bash 1, Bash 2, Bash 3 и Bash 4 на одну Linux VM?

Я понимаю, что

  1. некоторые комбинации менее важны и, вероятно, их можно игнорировать, и
  2. В конечном итоге я бы хотел протестировать несколько версий каждой ОС,

но это действительно не имеет отношения к данному вопросу, поэтому я откладываю такие вопросы в сторону, чтобы рассмотреть, возможно ли это.

Так:есть ли какой-либо практический способ установить и использовать несколько версий одной оболочки на одной машине?


1 Я использую термин «скрипт» в широком смысле. Одна из первых вещей, которую я хочу протестировать, — это то, что будет получено из rcфайлов оболочки, будь то .zshrc, .bash_profileили что-то еще, поэтому у него не будет собственной строки shebang. Отсюда и желание заставить один кусок кода работать в нескольких оболочках. Другие вещи, которые были бы полезны в разных оболочках, — это функции и псевдонимы, которые я хотел бы использовать на разных машинах, хотя они не обязательно все будут иметь мою любимую оболочку (Z Shell), но могут заставить меня использовать Bash или Korn. Также любые полезные фрагменты, которые я мог бы использовать в скриптах оболочки на нескольких машинах, даже если я не могу поместить свою любимую оболочку в строку shebang.

2. Совершенно не относящееся к делу примечание, добавленное только для того, чтобы не вводить в заблуждение: на самом деле я еще не настроил виртуальную машину OS X, так как это довольно хлопотно, но я надеюсь это сделать, и включил ее в список, чтобы никто не сказал: «Эй! Почему вы не включаете 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, вы можете установить каждую версию оболочки в ее собственный префикс. Если вы хотите поместить их в свой 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

asdfразработан специально для «управления несколькими версиями среды выполнения с помощью одного инструмента CLI», независимо от того, является ли эта среда выполнения языком, оболочкой или чем-то еще. Он имеетплагин для Zsh, так что это должно быть гораздо удобнее, чем разрабатывать собственное решение.

Обновлять Хотя asdfэто может быть более удобно, в нем нет плагинов для всех упомянутых оболочек, поэтому я рекомендую использовать подход Zanchey.

Связанный контент