Comment puis-je en toute sécurité obtenir la version de ksh depuis un script ksh ?
J'ai vu les solutions suivantes :
ksh --versionecho ${.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},kshtraite 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_VERSIONsemble 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_VERSIONest 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_VERSIONassez bien? Je veux dire si c'est vide, alors c'estkshforcé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_VERSIONpour détectermksh,pdksh,lksh - Si la première étape échoue, essayez une fonctionnalité différente entre
ksh93etksh88/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