
できるだけ多くの環境でスクリプト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 にインストールできますか?
把握した
- いくつかの組み合わせはそれほど重要ではなく、おそらく無視できるものであり、
- 最終的には各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 はすべて--prefix
configure 引数をサポートしているので、各バージョンをダウンロードして を実行できます。次に、各バージョンを使用するには、先頭に./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