Jak mohu bezpečně získat verzi ksh ze skriptu ksh?
Viděl jsem následující řešení:
ksh --version
echo ${.sh.version}
echo $KSH_VERSION
A za správných okolností každá z nich funguje správně. Nicméně mě zajímá ten nedokonalý případ.
Konkrétně existuje několik strojů, se kterými pracuji a které mají starší verze ksh, které pro mé účely výrazně postrádají funkčnost. Každopádně důvodem, proč chci verzi zkontrolovat (programově), je zjistit, zda verze ksh není jednou z méně schopných verzí; a pokud ano, chci spustit větev s méně úžasným kódem.
Na problematických strojích se však nešikovnost shellu rozšiřuje i do kontroly verze…
- Pokud zkusím
ksh --version
, nevytiskne nic a otevře novou instanciksh
! -
Pokud zkusím
echo ${.sh.version}
,ksh
považuje to za chybu syntaxe, kterou nelze zahodit pomocí2> /dev/null
.$ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution
-
Samozřejmě
echo $KSH_VERSION
Zdá se, že funguje dobře – myslím, že nespadne – i když na těchto počítačích je prázdný. Také jsem někde viděl, žeKSH_VERSION
nastavuje pouzepdksh
.
Otázky:
- Jak mohu bezpečně zkontrolovat verzi
ksh
programově? Pro mé účely mě opravdu nezajímá, jaké je skutečné číslo verze, ale zda se nejedná o zastaralou verziksh
. - Je
$KSH_VERSION
dostatečně dobrý? Myslím tím, že pokud je prázdné, pak jeksh
nutně zastaralá verze? Bylo to jiné fórum správné, že nemusí být nastaveno ani pro novější verzeksh
? - Neexistuje žádný způsob, jak to vůbec zkontrolovat?
Přijatá odpověď:
KSH_VERSION
nebyl implementován v ksh93
před verzí 93t. Bude nastaveno v mksh
, pdksh
, lksh
. Takže pro kontrolu verze ksh
, můžeme zkusit tyto kroky:
- Kontrola
KSH_VERSION
k detekcimksh
,pdksh
,lksh
- Pokud první krok selže, vyzkoušejte funkci, která se liší od
ksh93
aksh88/86
(Ať nám to ukáže David Korn).
S ohledem na tyto skutečnosti půjdu s:
case "$KSH_VERSION" in
(*MIRBSD*|*PD*|*LEGACY*) printf '%sn' "$KSH_VERSION" ;;
(*) [ -z "$ERRNO" ] && printf '%sn' "${.sh.version}" || echo ksh88/86 ;;
esac