Wie kann ich sicher die Version von ksh aus einem ksh-Skript abrufen?
Ich habe die folgenden Lösungen gesehen:
ksh --versionecho ${.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 --versionversuche , es gibt nichts aus und öffnet eine neue Instanz vonksh! -
Wenn ich versuche
echo ${.sh.version},kshbehandelt dies als Syntaxfehler, der nicht mit2> /dev/nullverworfen werden kann .$ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution -
Natürlich
echo $KSH_VERSIONscheint gut zu funktionieren – ich meine, es wird nicht abstürzen – obwohl es auf diesen Maschinen leer ist. Außerdem habe ich irgendwo dieseKSH_VERSIONgesehen wird nur vonpdkshgesetzt .
Fragen:
- Wie kann ich die Version von
kshsicher überprüfen programmatisch? Für meine Zwecke hier interessiert mich die tatsächliche Versionsnummer nicht wirklich, nur ob es sich um eine veraltete Version vonkshhandelt . - Ist
$KSH_VERSIONgut genug? Ich meine, wenn es leer ist, dann ist eskshunbedingt eine veraltete Version? War das andere Forum richtig, dass es möglicherweise nicht einmal für neuere Versionen vonksheingestellt 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_VERSIONummkshzu erkennen ,pdksh,lksh - Wenn der erste Schritt fehlschlägt, versuchen Sie eine Funktion, die sich von
ksh93unterscheidet 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