Wie kann ich die Version von ksh sicher aus einem ksh-Skript herunterladen?
Ich habe die folgenden Lösungen gesehen :
ksh --version
echo ${.sh.version}
echo $KSH_VERSION
Und unter den richtigen Umständen funktioniert jede dieser Funktionen ordnungsgemäß. Ich interessiere mich jedoch für den nicht perfekten Fall.
Insbesondere gibt es mehrere Maschinen, mit denen ich arbeite und die ältere Versionen von ksh haben, denen für meine Zwecke die Funktionalität stark fehlt. Wie auch immer, ich möchte die Version (programmgesteuert) überprüfen, um festzustellen, ob die ksh-Version eine der weniger leistungsfähigen Versionen ist. und wenn ja, möchte ich einen Zweig mit weniger fantastischem Code ausführen.
Auf den problematischen Rechnern reicht die Unfähigkeit der Shell jedoch aus, die Version zu überprüfen ...
- Wenn ich es versuche
ksh --version
, druckt es nichts und öffnet eine neue Instanz vonksh
! Wenn ich es versuche
echo ${.sh.version}
, wirdksh
dies als Syntaxfehler behandelt, der nicht verworfen werden kann2> /dev/null
.$ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution
Natürlich
echo $KSH_VERSION
scheint es gut zu funktionieren - ich meine, es wird nicht abstürzen - obwohl es auf diesen Maschinen leer ist. Auch habe ich irgendwo gesehen, dassKSH_VERSION
nur durch gesetzt wirdpdksh
.
Fragen:
- Wie kann ich die Version von sicher
ksh
programmgesteuert überprüfen ? Für meine Zwecke hier ist es mir eigentlich egal, wie die tatsächliche Versionsnummer lautet, nur ob es sich um eine veraltete Version von handeltksh
. - Ist
$KSH_VERSION
gut genug Ich meine, wenn es leer ist, ist es dannksh
notwendigerweise eine veraltete Version? War das andere Forum korrekt, dass es möglicherweise nicht einmal für neuere Versionen von eingestellt wurdeksh
? - Gibt es überhaupt keine Möglichkeit, dies zu überprüfen?
quelle
PS1
Verwendung dieser Funktion eingerichtet. Old ksh unterstützt jedoch nicht$()
inPS1
. Wenn es sich also um eine moderne Version von ksh handelt, möchte ich diePS1
von mir erstellte Funktion verwenden. wenn es die alte version ist, benutze ich eben$PWD
.Antworten:
Ich denke, dass
.sh.version
es das seit der ersten Version von ATT ksh 93 gibt. Es ist nicht in pdksh oder mksh verfügbar. Da${.sh.version}
es sich bei anderen Shells als ksh93 um einen Syntaxfehler handelt, schließen Sie den Test in eine Subshell ein und schützen Sie ihn dahintereval
.KSH_VERSION
startete im public domain ksh clone (pdksh) und wurde erst 2008 mit ksh93t zur aktuellen Korn-Shell hinzugefügt.Anstatt auf eine Versionsnummer zu testen, sollten Sie die spezifische Funktion testen, die Ihnen Kummer macht. Die meisten Funktionen können getestet werden, indem Sie ein Konstrukt in einer Subshell ausprobieren und prüfen, ob es einen Fehler auslöst.
quelle
${.sh.version}
als Syntaxfehler behandelt , der nicht abgeglichen werden kann. Die Nachricht, die ich bekomme, istbad substitution
./dev/null
und ignorieren Sie den Exit-Status.eval '_sh_version=$(echo "${.sh.version}")' 2>/dev/null
besser?KSH_VERSION
wurdeksh93
vor Version 93t nicht implementiert . Es wird festgelegt sein ,mksh
,pdksh
,lksh
. Um die Version von zu überprüfenksh
, können wir folgende Schritte ausführen:KSH_VERSION
zu erkennenmksh
,pdksh
,lksh
ksh93
undksh88/86
( Lassen Sie sich von David Korn zeigen ).In diesem Sinne werde ich gehen mit:
quelle
$KSH_VERSION
nicht leer ist? Auf meinem Ubuntu-Rechner wird "ksh93" gedruckt,KSH_VERSION
ist aber eingestellt..kshrc
.ENV
Variable gesetzt ist (und normalerweise auf gesetzt ist~/.kshrc
), liest das Skript die.kshrc
Datei definitiv . Natürlich wäre es ziemlich seltsam, wenn ein Skript eine falsche KSH_VERSION setzen würde, aber dies ist dennoch möglich, genauso wie die explizite Ausführung eines Skripts mit einem anderen Interpreter als dem in der ersten Zeile angegebenen eine mögliche Situation ist.KSH_VERSION
. verweisen . Und inmksh
,pdksh
,lksh
,KSH_VERSION
wird als Nur - Lese markiert.Für "echte"
ksh
Releases (dh AT & T-basiert) verwende ich diesen Befehl:Hier sind verschiedene Ausgaben, die ich bekomme:
Original ksh:
dtksh;
Modernes ksh93:
Für
pdksh
/msh
ksh
clones und moderne AT & T-ksh
Versionen funktioniert Folgendes:Bearbeiten:
Ich habe übersehen, dass Sie innerhalb eines Skripts gefragt haben, ob Sie dies tun möchten, ohne den Pfad zur getesteten ksh-Binärdatei zu kennen.
Angenommen, Sie möchten wirklich die verwendete Version
ksh
und nicht die unterstützten Funktionen, dann können Sie dies auf eine Weise tun, indem Sie nur denstrings
Befehl verwenden, der zumindest unter Linux und Solaris funktionieren sollte:Beachten Sie, dass diese Methode unzuverlässig ist, da sie
/proc
möglicherweise nicht bereitgestellt wird, und dass es sicherlich andere Schwachstellen gibt. Es ist auf anderen Unix-Betriebssystemen nicht getestet.quelle
lksh
undpdksh
in Debian Jessie unterscheiden.lksh
undpdksh
können nicht von ihren aussortiert werdenKSH_VERSION
?strings
auf ihnen laufen .KSH_VERSION
definitiv können.ksh
Veröffentlichungen» schrieb, schloss ich explizit Klone wiepdksh
,mksh
und aus , die nicht von AT & T stammenlksh
.strings
auf einer ksh-Binärdatei ist eine schlechte Idee, da Sie nicht wissen, ob dies diejenige ist, die Ihr Skript ausführt. Vielleicht wird Ihr Skript von/usr/local/bin/ksh
oder/home/bob/bin/ksh
oder/bin/sh
oder/usr/posix/bin/sh
oder ausgeführt ...Während ich ein Skript für schrieb
ksh
, bemerkte ich, dass die-a
Option des integriertenwhence
Befehls von ksh in älteren Versionen von anscheinend nicht unterstützt wirdksh
. Dies scheint auf allen von mir überprüften Systemen zuzutreffen, darunter Solaris, AIX, HP-UX und Linux.Also hier ist die Lösung als ksh-Funktion:
Und so benutzt man es:
quelle
${.sh.version}
?whence
in Zsh-a
whence
Befehl, der in keiner Weise an ksh oder die Version davon gebunden ist. Ich weiß nicht einmal, warum Sie prüfen sollten, ob ksh eine alte Version aus einer Instanz von zsh ist, einer völlig anderen Shell./bin/ksh
, zB unter Debian Linux. Jetzt benutze ich es dort nicht (und im Moment kann ich meine Login-Shell nicht ändern, um es zu überprüfen), also weiß ich nicht, ob es liest.kshrc
oder nicht, aber ich würde vermuten, dass es das tut.CTRL+ ALT+V
oder
ESC, CTRL+V
Hat sich in der Regel als sehr zuverlässig erwiesen, wenn es darum geht, die von Ihnen verwendete KSH-Version interaktiv zu bestimmen. Die Skripterstellung hat sich jedoch als schwieriger erwiesen.
quelle
set -o vi
, um die Tastenkombinationen auf vi-like einzustellen. Vorher oder mit + o vi oder -o emacs würde es mir einfach nicht zeigen. PD KSH v5.2.14 99/07 / 13.2 auf openbsd 6.1Ich denke, das grundlegende Problem bei der Verwendung von $ {. Sh.version} ist, dass ksh88 mit einem Exit-Code ungleich Null einfach stoppt.
Meine Lösung besteht also darin, den Code, der auf $ {. Sh.version} verweist, in eine Sub-Shell einzufügen und dann zu testen, ob die Sub-Shell nicht null ist und Code in der Sub-Shell enthält, der für Versionen von funktioniert Das ksh, in dem der Verweis auf $ {. sh.version} funktioniert. Wrapping in eine Funktion, die dann von einer anderen Funktion aufgerufen wird, die den Rückkehrcode umkehrt, so dass der letzte Aufruf auf true überprüft.
Ich habe dies unter AIX und Oracle Enterprise Linux 5 & 6 mit ksh88, ksh93 und pdksh ausgeführt.
Pete
quelle
.sh.version
(in der TatKSH_VERSION
ist ein Pseudonym dafür). Auch einige Shells, z. B. NetBSD sh, hören nach dem Auffinden einfach auf zu lesen,${.sh.version}
und keine Umleitung kann dazu führen, dass sie das Skript ausführen.Das Folgende scheint für alle Shells, die ich getestet habe, einigermaßen zu funktionieren, einschließlich des alten ksh88e und einer fast vollständigen Reihe gängiger Ksh-Klone (obwohl nur eine Version von jeder), obwohl ich noch keine tatsächliche Original-Bourne-Shell getestet habe ( und dazu muss möglicherweise der
test
Ausdruck für ältere Versionen angepasst werden ....Nachtrag:
Ich habe dies jetzt auch erfolgreich mit Heirloom Bourne Shell getestet, allerdings mit einem externen (und moderneren)
test
Programm.quelle
${.sh.version}
die nicht Teil der Lösung sein können, da bestimmte Versionen von ksh - die Versionen, um die sich der ursprüngliche Beitrag gekümmert hat - in dieser Syntax fatalerweise fehlerhaft sind.