Come posso sicuro ottenere la versione di ksh da uno script ksh?
Ho visto le seguenti soluzioni:
ksh --version
echo ${.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}
,ksh
tratta 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_VERSION
sembra 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
ksh
programmaticamente? 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_VERSION
abbastanza buono? Voglio dire, se è vuoto, allora èksh
necessariamente 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_VERSION
per rilevaremksh
,pdksh
,lksh
- Se il primo passaggio non riesce, prova una funzione diversa da
ksh93
eksh88/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