どうすれば安全に kshスクリプト内からkshのバージョンを取得しますか?
私は次の解決策を見てきました:
-
ksh --version
-
echo ${.sh.version}
-
echo $KSH_VERSION
そして、適切な状況が与えられれば、これらのそれぞれが正しく機能します。しかし、私は不完全なケースを気にします。
具体的には、古いバージョンのkshを使用しているマシンがいくつかありますが、私の目的では、機能が大幅に不足しています。とにかく、バージョンを(プログラムで)チェックしたい理由は、kshバージョンが機能の劣るバージョンの1つであるかどうかを確認するためです。もしそうなら、私はそれほど素晴らしいコードでブランチを実行したいと思います。
ただし、問題のあるマシンでは、シェルの不適切さはバージョンのチェックにまで及びます…
-
ksh --version
を試してみると 、何も出力せず、ksh
の新しいインスタンスを開きます ! -
echo ${.sh.version}
を試してみると 、ksh
これを2> /dev/null
で破棄できない構文エラーとして扱います 。$ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution
-
もちろん、
echo $KSH_VERSION
これらのマシンでは空白ですが、正常に動作しているように見えます。つまり、クラッシュすることはありません。また、どこかでそのKSH_VERSION
を見ましたpdksh
によってのみ設定されます 。
質問:
-
ksh
のバージョンを安全に確認するにはどうすればよいですか。 プログラムで?ここでの私の目的では、実際のバージョン番号が何であるかは気にせず、ksh
の古いバージョンであるかどうかだけを確認します。 。 -
$KSH_VERSION
です 十分ですか?つまり、空白の場合はksh
必然的に古いバージョン?ksh
の新しいバージョンでも設定されない可能性があるという他のフォーラムは正しかったですか? ? - これを確認する方法はまったくありませんか?
承認された回答:
KSH_VERSION
ksh93
には実装されていません バージョン93tより前。 mksh
で設定されます 、pdksh
、lksh
。したがって、ksh
のバージョンを確認するため 、次の手順を試すことができます:
-
KSH_VERSION
を確認していますmksh
を検出する 、pdksh
、lksh
- 最初の手順が失敗した場合は、
ksh93
とは異なる機能を試してください およびksh88/86
(David Kornに見せてもらいましょう。)
これらを念頭に置いて、私は次のことを行います:
case "$KSH_VERSION" in
(*MIRBSD*|*PD*|*LEGACY*) printf '%sn' "$KSH_VERSION" ;;
(*) [ -z "$ERRNO" ] && printf '%sn' "${.sh.version}" || echo ksh88/86 ;;
esac