Estoy involucrado en el proceso de portar un sistema que contiene varios cientos de scripts ksh de AIX, Solaris y HPUX a Linux. Me he encontrado con la siguiente diferencia en la forma en que se comporta ksh en los dos sistemas:¿Cómo superar una incompatibilidad entre el ksh en Linux y el que está instalado en AIX/Solaris/HPUX?
#!/bin/ksh
flag=false
echo "a\nb" | while read x
do
flag=true
done
echo "flag = ${flag}"
exit 0
En AIX, Solaris y HP-UX la salida es "flag = true" en Linux, la salida es "bandera = false".
Mis preguntas son:
- ¿Hay una variable de entorno que pueda establecer para conseguir ksh de Linux se comporte como el otro sistema operativo de? En su defecto:
- ¿Existe una opción en el ksh de Linux para obtener el comportamiento requerido? En su defecto:
- ¿Existe una implementación de ksh disponible para Linux con el comportamiento deseado?
Otras notas:
- En AIX, Solaris y HPUX ksh es una variante de ksh88.
- En Linux, ksh es de dominio público ksh (pdksh)
- En AIX, Solaris y HP-UX dtksh y ksh93 (donde los he instalado) son consistentes con ksh
- Los sistemas Windows NT que tienen acceso a: Cygwin y MKS NT son consistentes con Linux.
- En AIX, Solaris y Linux, bash es coherente, dando el resultado incorrecto (desde mi perspectiva) de "flag = false".
La siguiente tabla resume los sistemas del problema:
uname -s uname -r which ksh ksh version flag =
======== ======== ========= =========== ======
Linux 2.6.9-55.0.0.0.2.ELsmp /bin/ksh PD KSH v5.2.14 99/07/13.2 false
AIX 3 /bin/ksh Version M-11/16/88f true // AIX 5.3
/bin/ksh93 Version M-12/28/93e true
SunOS 5.8, 5.9 and 5.10 /bin/ksh Version M-11/16/88i true
/usr/dt/bin/dtksh Version M-12/28/93d true
HP-UX B.11.11 and B.11.23 /bin/ksh Version 11/16/88 true
/usr/dt/bin/dtksh Version M-12/28/93d true
CYGWIN_NT-5.1 1.5.25(0.156/4/2) /bin/ksh PD KSH v5.2.14 99/07/13.2 false
Windows_NT 5 .../mksnt/ksh.exe Version 8.7.0 build 1859... false // MKS
actualización
Después de algunos consejos de la gente en mi empresa hemos decidido hacer la siguiente modificación en el código. Esto nos da el mismo resultado si usamos el ksh "real" (ksh88, ksh93) o cualquiera de los clones ksh (pdksh, MSK ksh). Esto también funciona correctamente con bash.
#!/bin/ksh
echo "a\nb" > junk
flag=false
while read x
do
flag=true
done < junk
echo "flag = ${flag}"
exit 0
Gracias a jj33 por la respuesta aceptada anteriormente.
¿Qué distribución de Linux está usando? Eso hace una diferencia en cómo obtener el ksh "correcto" – Thomee
Esta pregunta está muy relacionada: http://stackoverflow.com/questions/124167/bash-variable-scope – pixelbeat