1 台のマシンで 1 つのシェルの複数のバージョンを実行する方法

1 台のマシンで 1 つのシェルの複数のバージョンを実行する方法

できるだけ多くの環境でスクリプト1をテストするために、UNIX (または Unix ライクなオペレーティング システム) を搭載した VM をいくつかセットアップしました。

  • リナックス
  • ソラリス
  • OS X 2
  • フリーBSD

しかし、実際には、さまざまなオペレーティング システムを使用してテストするよりも、重要視する予定の各シェルのさまざまなバージョンを使用してテストする方が、多くの点で重要であると私は考えています。

VM が無限の組み合わせで増え続けるのは避けたいので、特定の VM に各シェルの複数のバージョンをインストールしたいと思います。たとえば、 でテストする場合、[:bash,:zsh,:fish,:ksh,:csh,:tcsh,:sh,:dash,:ash]シェルは 9 つあり、各シェルの平均 3 つのバージョンをテストすると仮定すると、VM は 100 台以上になります。

# operating_systems * shells * shell_versions
            4       *   9    *     3

特定のシェルの複数のバージョンを単一のマシンまたは仮想マシンにインストールして使用する実用的な方法はありますか? たとえば、Bash 1、Bash 2、Bash 3、Bash 4 をすべて 1 つの Linux VM にインストールできますか?

把握した

  1. いくつかの組み合わせはそれほど重要ではなく、おそらく無視できるものであり、
  2. 最終的には各OSの複数のバージョンもテストしたいと思っています。

しかし、それらはこの質問とはまったく別の問題なので、私はそのような問題を脇に置いて、これが可能かどうかを検討します。

それで:特定のシェルの複数のバージョンを 1 台のマシンにインストールして使用する実用的な方法はありますか?


1 私は「スクリプト」という用語を大まかに使用しています。最初にテストしたいことの 1 つは、、 、または何rcであっても、シェル ファイルによってソース化されるもので、独自のシェバン行はありません。したがって、1 つのコード ビットを複数のシェルで動作させる必要があります。シェル間で役立つその他のものとしては、必ずしもすべてのマシンにお気に入りのシェル (Z Shell) があるわけではありませんが、Bash または Korn を使用するようにする可能性のある、さまざまなマシンで使用したい関数とエイリアスがあります。また、お気に入りのシェルをシェバン行に指定できない場合でも、複数のマシンのシェル スクリプトで使用したい便利なスニペットもあります。.zshrc.bash_profile

2 完全に関係のないメモですが、誤解を招くようなことを言わないためにのみ含めました。OS X VM のセットアップはかなり面倒なので、実際にはセットアップしていませんが、セットアップしたいと思っています。また、誰も「おい、なぜ OS X を含めないんだ?」と言わないように、リストに含めました。

答え1

ソースからビルドすることに問題がない場合は、各バージョンを別々のプレフィックスにインストールし、それに応じてスクリプト内のパスを調整できます。

bash、fish、ksh、tcsh、zsh、dash はすべて--prefixconfigure 引数をサポートしているので、各バージョンをダウンロードして を実行できます。次に、各バージョンを使用するには、先頭に./configure --prefix=/opt/SHELL-VERSION; make; make installPATH を設定します。/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

空自は、そのランタイムが言語であれ、シェルであれ、何であれ、「単一のCLIツールで複数のランタイムバージョンを管理する」ために特別に設計されています。Zsh用プラグインしたがって、独自のソリューションを作成するよりもはるかに便利です。

アップデート より便利かもしれませんがasdf、言及されているすべてのシェル用のプラグインがないので、Zanchey のアプローチを使用することをお勧めします。

関連情報