Я участвую в процессе переноса системы, содержащей несколько сотен сценариев ksh, из AIX, Solaris и HPUX в Linux. Я обнаружил следующее различие в поведении ksh в двух системах:
#!/bin/ksh
flag=false
echo "a\nb" | while read x
do
flag=true
done
echo "flag = ${flag}"
exit 0
В AIX, Solaris и HPUX вывод «flag = true», в Linux вывод «flag = false».
Мои вопросы:
- Есть ли переменная окружения, которую я могу установить, чтобы Linux ksh вел себя как
другие осы '? В противном случае:
- Есть ли опция в ksh Linux, чтобы получить требуемое поведение? В противном случае:
- Доступна ли для Linux реализация ksh с требуемым поведением?
Другие примечания:
- В AIX, Solaris и HPUX ksh является вариантом ksh88.
- В Linux ksh является общественным достоянием ksh (pdksh)
- В AIX, Solaris и HPUX dtksh и ksh93 (где они у меня установлены) соответствуют ksh
- Системы Windows NT, к которым у меня есть доступ: Cygwin и MKS NT, совместимы с Linux.
- В AIX, Solaris и Linux bash работает согласованно, давая неверный (с моей точки зрения) результат «flag = false».
В следующей таблице приведены проблемы системы:
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
Обновление
После некоторых советов от сотрудников моей компании мы решили внести следующие изменения в код. Это дает нам один и тот же результат, будь то использование "настоящих" ksh (ksh88, ksh93) или любого из клонов ksh (pdksh, MSK ksh). Это также правильно работает с bash.
#!/bin/ksh
echo "a\nb" > junk
flag=false
while read x
do
flag=true
done < junk
echo "flag = ${flag}"
exit 0
Спасибо jj33 за ранее принятый ответ.