So führen Sie mehrere Versionen einer Shell auf einer einzigen Maschine aus

So führen Sie mehrere Versionen einer Shell auf einer einzigen Maschine aus

Um einige Skripte 1 in möglichst vielen Umgebungen zu testen, habe ich mehrere VMs mit UNIX (oder Unix-ähnlichen Betriebssystemen) eingerichtet:

  • Linux
  • Solaris
  • OS X 2
  • FreeBSD

Ich gehe jedoch davon aus, dass es in vielerlei Hinsicht wichtiger ist, mit unterschiedlichen Versionen der für mich interessanten Shell zu testen, als mit unterschiedlichen Betriebssystemen.

Da ich meine VMs nicht in scheinbar endlosen Permutationen vervielfältigen möchte, möchte ich mehrere Versionen jeder Shell auf jeder VM installieren. Wenn ich beispielsweise unter teste, [:bash,:zsh,:fish,:ksh,:csh,:tcsh,:sh,:dash,:ash]habe ich 9 Shells, und wenn ich davon ausgehe, dass ich durchschnittlich 3 Versionen jeder Shell teste, habe ich über 100 VMs:

# operating_systems * shells * shell_versions
            4       *   9    *     3

Gibt es eine praktische Möglichkeit, mehrere Versionen einer bestimmten Shell auf einer einzelnen Maschine oder virtuellen Maschine zu installieren und zu verwenden? Kann ich beispielsweise Bash 1, Bash 2, Bash 3 und Bash 4 alle auf einer Linux-VM installieren?

Ich realisiere es

  1. Einige Kombinationen sind weniger wichtig und können wahrscheinlich ignoriert werden.
  2. letztendlich möchte ich auch mehrere Versionen jedes Betriebssystems testen,

Aber das ist wirklich unabhängig von dieser Frage, also lege ich solche Probleme beiseite, um zu überlegen, ob dies möglich ist.

Also:Gibt es eine praktische Möglichkeit, mehrere Versionen einer bestimmten Shell auf einer einzigen Maschine zu installieren und zu verwenden?


1 Ich verwende den Begriff „Skript“ im weitesten Sinne. Eines der ersten Dinge, die ich testen möchte, ist etwas, das von den Shell- rcDateien einer Person bezogen wird, sei es .zshrc, .bash_profile, oder was auch immer, sodass es keine eigene Shebang-Zeile hat. Daher der Wunsch, ein Stück Code über mehrere Shells hinweg funktionieren zu lassen. Andere Dinge, die über Shells hinweg nützlich wären, wären Funktionen und Aliase, die ich auf verschiedenen Maschinen verwenden möchte, obwohl sie nicht unbedingt alle meine Lieblingsshell (Z Shell) haben, mich aber möglicherweise dazu bringen, Bash oder Korn zu verwenden. Auch alle nützlichen Snippets, die ich möglicherweise in Shell-Skripten auf mehreren Maschinen verwenden möchte, selbst wenn ich meine Lieblingsshell nicht in die Shebang-Zeile einfügen kann.

2 Völlig nebensächliche Anmerkung, die nur eingefügt wurde, um nichts Irreführendes zu sagen: Ich habe die OS X-VM noch nicht eingerichtet, da das ziemlich umständlich ist, aber ich hoffe, dass ich es schaffe, und habe sie in die Liste aufgenommen, damit niemand sagt: „Hey! Warum schließt du OS X nicht mit ein?!“

Antwort1

Wenn Sie mit dem Erstellen aus der Quelle zufrieden sind, können Sie jede Version in einem separaten Präfix installieren und dann den Pfad in Ihren Skripten entsprechend anpassen.

bash, fish, ksh, tcsh, zsh und dash unterstützen alle das --prefixArgument configure, sodass Sie jede Version herunterladen und ausführen können ./configure --prefix=/opt/SHELL-VERSION; make; make install. Um dann jede Version zu verwenden, legen Sie PATH so fest, dass es /opt/SHELL-VERSION/binvorne steht.

csh ist etwas anders und erfordert mehr Handarbeit; wenn Sie sicher sind, dass Sie es möchten, können Sie die Quellen aus dem FreeBSD-Quellcodebaum extrahieren und das Makefile bearbeiten, aber die meisten Leute verwenden sowieso tcsh.

Ich glaube nicht, dass es eine kanonische Quelle für Ash gibt, aber wahrscheinlich wird dort ein ähnlicher Ansatz verfolgt.

Antwort2

Wie Zanchey sagte, können Sie jede Shell-Version in ihrem eigenen Präfix installieren. Wenn Sie sie in Ihren PATH aufnehmen möchten, können Sie sie umbenennen und nach /usr/bin/ kopieren. Beispiel:

$ 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

Antwort3

asdfwurde speziell dafür entwickelt, „mehrere Runtime-Versionen mit einem einzigen CLI-Tool zu verwalten“, egal, ob es sich bei der Runtime um eine Sprache, eine Shell oder etwas anderes handelt. Es hat einePlugin für Zsh, daher sollte dies weitaus bequemer sein, als eine eigene Lösung zu entwickeln.

Aktualisieren Obwohl asdfes möglicherweise praktischer ist, sind nicht für alle genannten Shells Plug-ins vorhanden. Ich empfehle daher den Ansatz von Zanchey.

verwandte Informationen