¿Cómo puedo con seguridad obtener la versión de ksh desde un script ksh?
He visto las siguientes soluciones:
ksh --version
echo ${.sh.version}
echo $KSH_VERSION
Y dadas las circunstancias adecuadas, cada uno de estos funciona correctamente. Sin embargo, me importa el caso no perfecto.
Específicamente, hay varias máquinas con las que trabajo que tienen versiones anteriores de ksh que, para mis propósitos, carecen gravemente de funcionalidad. De todos modos, la razón por la que quiero verificar la versión (mediante programación) es para ver si la versión ksh es una de las versiones menos capaces; y si es así, quiero ejecutar una rama con un código menos impresionante.
Sin embargo, en las máquinas problemáticas, la ineptitud del shell se extiende a comprobar la versión...
- Si pruebo
ksh --version
, no imprime nada y abre una nueva instancia deksh
! -
Si pruebo
echo ${.sh.version}
,ksh
trata esto como un error de sintaxis que no se puede descartar con2> /dev/null
.$ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution
-
Por supuesto
echo $KSH_VERSION
parece funcionar bien, quiero decir que no fallará, aunque en estas máquinas está en blanco. Además, vi en alguna parte queKSH_VERSION
está configurado solo porpdksh
.
Preguntas:
- ¿Cómo puedo comprobar de forma segura la versión de
ksh
? programáticamente? Para mis propósitos aquí, realmente no me importa cuál es el número de versión real, solo si es una versión desactualizada deksh
. - Es
$KSH_VERSION
¿suficientemente bueno? Quiero decir, si está en blanco, entonces esksh
necesariamente una versión obsoleta? ¿Era correcto ese otro foro que podría no estar configurado incluso para versiones más nuevas deksh
? ? - ¿No hay manera de verificar esto en absoluto?
Respuesta aceptada:
KSH_VERSION
no se implementó en ksh93
antes de la versión 93t. Se establecerá en mksh
, pdksh
, lksh
. Entonces, para verificar la versión de ksh
, podemos probar estos pasos:
- Comprobando
KSH_VERSION
para detectarmksh
,pdksh
,lksh
- Si el primer paso falla, pruebe una característica diferente entre
ksh93
yksh88/86
(Dejemos que David Korn nos lo muestre).
Con esto en mente, iré con:
case "$KSH_VERSION" in
(*MIRBSD*|*PD*|*LEGACY*) printf '%sn' "$KSH_VERSION" ;;
(*) [ -z "$ERRNO" ] && printf '%sn' "${.sh.version}" || echo ksh88/86 ;;
esac