Ich bin gerade dabei, ein System mit mehreren hundert ksh-Skripten von AIX, Solaris und HPUX auf Linux zu portieren. Dabei bin ich auf den folgenden Unterschied im Verhalten von ksh auf den beiden Systemen gestoßen:
#!/bin/ksh
flag=false
echo "a\nb" | while read x
do
flag=true
done
echo "flag = ${flag}"
exit 0
Unter AIX, Solaris und HPUX lautet die Ausgabe "flag = true", unter Linux ist die Ausgabe "flag = false".
Meine Fragen sind:
- Gibt es eine Umgebungsvariable, die ich setzen kann, um Linux's ksh dazu zu bringen, sich so zu verhalten wie die anderen Os' verhält? Wenn das nicht möglich ist:
- Gibt es eine Option in Linux's ksh, um das gewünschte Verhalten zu erreichen? Wenn das nicht möglich ist:
- Gibt es eine ksh-Implementierung für Linux mit dem gewünschten Verhalten?
Sonstige Anmerkungen:
- Unter AIX, Solaris und HPUX ist ksh eine Variante von ksh88.
- Unter Linux ist ksh die Public Domain ksh (pdksh)
- Unter AIX, Solaris und HPUX sind dtksh und ksh93 (wo ich sie installiert habe) mit ksh konsistent
- Die Windows NT-Systeme, zu denen ich Zugang habe: Cygwin und MKS NT, sind mit Linux kompatibel.
- Unter AIX, Solaris und Linux ist die Bash konsistent und gibt das (aus meiner Sicht) falsche Ergebnis "flag = false" aus.
Die folgende Tabelle fasst die Systeme zusammen, die das Problem verursachen:
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
Update
Nach einigen Ratschlägen von Mitarbeitern meines Unternehmens haben wir beschlossen, die folgende Änderung am Code vorzunehmen. Damit erhalten wir das gleiche Ergebnis, egal ob wir die "echten" ksh's (ksh88, ksh93) oder einen der ksh-Klone (pdksh, MSK ksh) verwenden. Dies funktioniert auch korrekt mit der Bash.
#!/bin/ksh
echo "a\nb" > junk
flag=false
while read x
do
flag=true
done < junk
echo "flag = ${flag}"
exit 0
Vielen Dank an jj33 für die bereits akzeptierte Antwort.