Come posso sicuro ottenere la versione di ksh da uno script ksh?
Ho visto le seguenti soluzioni:
ksh --versionecho ${.sh.version}echo $KSH_VERSION
E date le giuste circostanze, ognuno di questi funziona correttamente. Tuttavia, mi interessa il caso non perfetto.
In particolare, ci sono diverse macchine con cui lavoro che hanno versioni precedenti di ksh che, per i miei scopi, sono gravemente carenti di funzionalità. Ad ogni modo, il motivo per cui voglio controllare la versione (a livello di codice) è vedere se la versione ksh è una delle versioni meno capaci; e se è così, voglio eseguire un ramo con un codice meno impressionante.
Tuttavia, sulle macchine problematiche, l'inettitudine della shell si estende al controllo della versione...
- Se provo
ksh --version, non stampa nulla e apre una nuova istanza diksh! -
Se provo
echo ${.sh.version},kshtratta questo come un errore di sintassi che non può essere eliminato con2> /dev/null.$ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution -
Ovviamente
echo $KSH_VERSIONsembra funzionare bene – voglio dire che non si arresterà in modo anomalo – anche se su queste macchine è vuoto. Inoltre, ho visto da qualche parte quelKSH_VERSIONè impostato solo dapdksh.
Domande:
- Come posso controllare in sicurezza la versione di
kshprogrammaticamente? Per i miei scopi qui, non mi interessa davvero quale sia il numero di versione effettivo, solo se si tratta di una versione obsoleta diksh. - È
$KSH_VERSIONabbastanza buono? Voglio dire, se è vuoto, allora èkshnecessariamente una versione obsoleta? L'altro forum era corretto che potrebbe non essere impostato anche per le versioni più recenti diksh? - Non c'è proprio modo di verificarlo?
Risposta accettata:
KSH_VERSION non è stato implementato in ksh93 prima della versione 93t. Sarà impostato in mksh , pdksh , lksh . Quindi per controllare la versione di ksh , possiamo provare questi passaggi:
- Controllo
KSH_VERSIONper rilevaremksh,pdksh,lksh - Se il primo passaggio non riesce, prova una funzione diversa da
ksh93eksh88/86(Ci mostri David Korn).
Con questi in mente, andrò con:
case "$KSH_VERSION" in
(*MIRBSD*|*PD*|*LEGACY*) printf '%sn' "$KSH_VERSION" ;;
(*) [ -z "$ERRNO" ] && printf '%sn' "${.sh.version}" || echo ksh88/86 ;;
esac