以前のバージョンのBashをエミュレートすることは可能ですか(この単語は正しいですか?)
私は4.3.11を使用しており、私のスクリプトがいくつかの古いバージョンと互換性があるかどうかを知りたいのですが、実際に古いバージョンをインストールしたくありません。変更ログを調べて、私が使用していた以前のバージョンで欠けていた機能が何であるかを見つけることができましたが、少し退屈だったようです。私は一種の魔法のコマンドラインオプションやスクリプトコマンド(おそらく希望)があることを願っています。
答え1
いいえ、bashは以前のバージョンのbashをエミュレートできません。しかし、古いバージョンのbashを含むテスト環境を設定するのは非常に簡単です。
各パッケージを手動でインストールする必要がある場合は、ライブラリの非互換性を解決するのは面倒で、個々のソフトウェアの以前のバージョンをインストールするのも面倒です。しかし、より簡単な解決策があります。以前のバージョンをインストールすることです。分配する。一貫したソフトウェアセット(開発パッケージを含む)を含む以前のディストリビューションをインストールするためのハードドライブスペースのコストは約1ドルで、最初のインストールには1時間かかることがあります。
これシュルートパッケージを使用すると、通常のLinuxシステムと同じシステムで実行されている古い(または最新の)Linuxディストリビューションを簡単にインストールできます。 schroot設定を簡単に実行できます。chroot) ここで、システムディレクトリは以前のソフトウェアを指しますが、ホームディレクトリは通常の環境のディレクトリです。私は書いたDebian ベースの配布ガイド;この方法で簡単にDebian slinkに戻ることができます(bash 2.01.01を使用)。
異なるUnixバリアント、異なるCPUアーキテクチャ、または非常に古いソフトウェアでテストしたい場合は、仮想マシンで別のオペレーティングシステムを実行できます。より多くのオーバーヘッド(RAM、ディスク容量、CPU、およびメンテナンス)が発生しますが、まだ実行可能です。
答え2
Dockerコンテナですべてのバージョンのbashを簡単にテストできます。
次のようにbash 3.2を実行しているDockerコンテナを起動できます。
$ docker run -it bash:3.2
Dockerにフォルダをマウントすると、コンピュータのDockerコンテナにあるスクリプトを簡単にテストできます。次の手順を実行すると、/Users/myuser
Dockerコンテナでフォルダを使用できます。/myuser
$ docker run -v /Users/myuser/:/myuser -it bash:3.2
ここにリストされているすべてのbashバージョンを使用できます。
その画像のソースはここにあります:
答え3
POSIX互換の方法でスクリプトを作成してから、または他のシェルなど、dash
まったく異なるシェルを使用してテストします。シェル言語の暗い隅と灰色の領域を避けてください。すべての操作を「標準」方式で実行します。zsh
pdksh
もちろん、これはあなたのコードが以前のバージョンのいくつかのBashバグのために困難を経験しないことを証明していませんが、自信を高めます。一方、Bashバグは、Bash関連の構成(移植可能なスクリプトが実行されていない場所)や、暗い隅と灰色の領域(多くのスクリプトが実行されていない場所)で見つかる可能性が高くなります。
つまり、四重逆評価を行う世界初のシェルスクリプトにならないでください。
スクリプトを移植可能にする利点の1つは、ユーザーが以前のBashインストールでスクリプトが機能しないことを発見したと仮定することです。まあ、スクリプトはBashに限定されないので、おそらく他のシェルで動作させることができ、すでにインストールされています。
コードに過去のBash関連のエラーが発生したかどうかを知る方法は2つだけです。これらの方法の1つだけを信頼できます(不要な方法:以前のバージョンのBashを取り出してテストしてみてください)。もう1つのアプローチは、Bashの変更履歴を慎重に調査し、スクリプトの操作に影響を与える可能性がある以前のバージョンのバグがあるかどうかを確認することです。
いくつかの古いディストリビューションをホストし、時々回帰テストを実行するためにVMを維持します。