Wie kann ich sicher die Version von ksh aus einem ksh-Skript abrufen?
Ich habe die folgenden Lösungen gesehen:
ksh --version
echo ${.sh.version}
echo $KSH_VERSION
Und unter den richtigen Umständen funktioniert jedes davon richtig. Ich kümmere mich jedoch um den nicht perfekten Fall.
Insbesondere gibt es mehrere Maschinen, mit denen ich arbeite, die ältere Versionen von ksh haben, denen es für meine Zwecke stark an Funktionalität mangelt. Wie auch immer, der Grund, warum ich die Version (programmgesteuert) überprüfen möchte, ist, um zu sehen, ob die ksh-Version eine der weniger leistungsfähigen Versionen ist; und wenn ja, möchte ich einen Branch mit weniger tollem Code ausführen.
Auf den problematischen Maschinen erstreckt sich die Unfähigkeit der Shell jedoch auf die Überprüfung der Version …
- Wenn ich
ksh --version
versuche , es gibt nichts aus und öffnet eine neue Instanz vonksh
! -
Wenn ich versuche
echo ${.sh.version}
,ksh
behandelt dies als Syntaxfehler, der nicht mit2> /dev/null
verworfen werden kann .$ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution
-
Natürlich
echo $KSH_VERSION
scheint gut zu funktionieren – ich meine, es wird nicht abstürzen – obwohl es auf diesen Maschinen leer ist. Außerdem habe ich irgendwo dieseKSH_VERSION
gesehen wird nur vonpdksh
gesetzt .
Fragen:
- Wie kann ich die Version von
ksh
sicher überprüfen programmatisch? Für meine Zwecke hier interessiert mich die tatsächliche Versionsnummer nicht wirklich, nur ob es sich um eine veraltete Version vonksh
handelt . - Ist
$KSH_VERSION
gut genug? Ich meine, wenn es leer ist, dann ist esksh
unbedingt eine veraltete Version? War das andere Forum richtig, dass es möglicherweise nicht einmal für neuere Versionen vonksh
eingestellt ist? ? - Gibt es überhaupt keine Möglichkeit, dies zu überprüfen?
Akzeptierte Antwort:
KSH_VERSION
wurde in ksh93
nicht implementiert vor Version 93t. Es wird in mksh
gesetzt , pdksh
, lksh
. Also zum Überprüfen der Version von ksh
, können wir diese Schritte ausprobieren:
- Überprüfe
KSH_VERSION
ummksh
zu erkennen ,pdksh
,lksh
- Wenn der erste Schritt fehlschlägt, versuchen Sie eine Funktion, die sich von
ksh93
unterscheidet undksh88/86
(Lass uns David Korn zeigen).
In Anbetracht dessen gehe ich mit:
case "$KSH_VERSION" in
(*MIRBSD*|*PD*|*LEGACY*) printf '%sn' "$KSH_VERSION" ;;
(*) [ -z "$ERRNO" ] && printf '%sn' "${.sh.version}" || echo ksh88/86 ;;
esac