5 Stimmen

Wie kann man eine Inkompatibilität zwischen der ksh unter Linux und der unter AIX/Solaris/HPUX installierten überwinden?

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.

0voto

zigdon Punkte 13865

Ich kenne keine spezielle Option, um ksh zu zwingen, mit einer bestimmten älteren Version kompatibel zu sein. Abgesehen davon könnten Sie vielleicht eine sehr alte Version von ksh auf Ihrem Linux-Rechner installieren und sie auf eine kompatible Weise verhalten lassen?

Es könnte einfacher sein, eine modernere Version von amy shell auf den AIX/HP-UX-Systemen zu installieren und Ihre Skripte einfach auf sh umzustellen. Ich weiß, dass es Versionen von bash für alle Plattformen gibt.

0voto

Alex M Punkte 2438

Ihr Skript gibt die richtige (wahre) Ausgabe, wenn zsh wird mit dem emulate -L ksh Option. Wenn alles andere fehlschlägt, können Sie versuchen, mit zsh unter Linux.

0voto

szabgab Punkte 5964

Müssen Sie innerhalb von ksh bleiben?

Selbst wenn Sie die gleiche ksh verwenden, werden Sie immer noch alle möglichen externen Befehle aufrufen (grep, ps, cat, etc...), von denen einige von System zu System unterschiedliche Parameter und unterschiedliche Ausgaben haben. Entweder müssen Sie diese Unterschiede berücksichtigen oder die GNU-Version eines jeden dieser Befehle verwenden, um die Dinge gleich zu machen.

En Perl Programmiersprache wurde ursprünglich genau zur Lösung dieses Problems entwickelt. Sie enthält alle Funktionen, die ein Unix-Shell-Programmierer von einem Shell-Programm erwarten würde, aber sie ist auf jedem Unix-System gleich. Sie haben vielleicht nicht auf allen Systemen die neueste Version Systemen, aber wenn Sie etwas installieren müssen, ist es vielleicht besser, Perl zu installieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X