Comment puis-je en toute sécurité obtenir la version de ksh depuis un script ksh ?
J'ai vu les solutions suivantes :
ksh --version
echo ${.sh.version}
echo $KSH_VERSION
Et dans les bonnes circonstances, chacun de ces éléments fonctionne correctement. Cependant, je me soucie du cas non parfait.
Plus précisément, il y a plusieurs machines avec lesquelles je travaille qui ont des versions plus anciennes de ksh qui, pour mes besoins, manquent cruellement de fonctionnalités. Quoi qu'il en soit, la raison pour laquelle je souhaite vérifier la version (par programme) est de voir si la version ksh est l'une des versions les moins performantes. et si c'est le cas, je veux exécuter une branche avec un code moins génial.
Cependant, sur les machines problématiques, l'incompétence du shell va jusqu'à vérifier la version…
- Si j'essaie
ksh --version
, il n'imprime rien et ouvre une nouvelle instance deksh
! -
Si j'essaie
echo ${.sh.version}
,ksh
traite cela comme une erreur de syntaxe qui ne peut pas être ignorée avec2> /dev/null
.$ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution
-
Bien sûr
echo $KSH_VERSION
semble fonctionner correctement - je veux dire qu'il ne plantera pas - bien que sur ces machines, il soit vide. Aussi, j'ai vu quelque part queKSH_VERSION
est défini uniquement parpdksh
.
Question :
- Comment puis-je vérifier en toute sécurité la version de
ksh
? par programmation ? Pour mes besoins ici, je ne me soucie pas vraiment du numéro de version réel, juste s'il s'agit d'une version obsolète deksh
. - Est
$KSH_VERSION
assez bien? Je veux dire si c'est vide, alors c'estksh
forcément une version obsolète ? Cet autre forum avait-il raison de dire qu'il pourrait ne pas être défini même pour les nouvelles versions deksh
? - N'y a-t-il tout simplement aucun moyen de vérifier cela ?
Réponse acceptée :
KSH_VERSION
n'a pas été implémenté dans ksh93
avant la version 93t. Il sera défini dans mksh
, pdksh
, lksh
. Donc, pour vérifier la version de ksh
, nous pouvons essayer ces étapes :
- Vérification de
KSH_VERSION
pour détectermksh
,pdksh
,lksh
- Si la première étape échoue, essayez une fonctionnalité différente entre
ksh93
etksh88/86
(Laissons David Korn nous montrer).
En gardant cela à l'esprit, je vais choisir :
case "$KSH_VERSION" in
(*MIRBSD*|*PD*|*LEGACY*) printf '%sn' "$KSH_VERSION" ;;
(*) [ -z "$ERRNO" ] && printf '%sn' "${.sh.version}" || echo ksh88/86 ;;
esac