Jak mohu bezpečně získat verzi ksh ze skriptu ksh?
Viděl jsem následující řešení:
ksh --versionecho ${.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},kshpovaž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_VERSIONZdá 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_VERSIONnastavuje pouzepdksh.
Otázky:
- Jak mohu bezpečně zkontrolovat verzi
kshprogramově? Pro mé účely mě opravdu nezajímá, jaké je skutečné číslo verze, ale zda se nejedná o zastaralou verziksh. - Je
$KSH_VERSIONdostatečně dobrý? Myslím tím, že pokud je prázdné, pak jekshnutně 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_VERSIONk detekcimksh,pdksh,lksh - Pokud první krok selže, vyzkoušejte funkci, která se liší od
ksh93aksh88/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