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

Ich habe ein weiteres Problem in dem Bemühen entdeckt, mehrere hundert ksh-Skripte von AIX, Solaris und HPUX auf Linux zu portieren. Siehe hier für das vorherige Problem.

Dieser Code:

#!/bin/ksh
if [ -a k* ]; then
    echo "Oh yeah!"
else
    echo "No way!"
fi
exit 0

(when run in a directory with several files whose name starts with k) produces "Oh yeah!" when called with the AT&T ksh variants (ksh88 and ksh93). On the other hand it produces and error message followed by "No way!" on the other ksh variants (pdksh, MKS ksh and bash).

Auch hier sind meine Fragen:

  • Gibt es eine Umgebungsvariable, die dazu führt, dass sich pdksh wie ksh93 verhält? Versäumnis das:
  • Gibt es eine Option für pdksh, um das erforderliche Verhalten zu erhalten?
0
hinzugefügt bearbeitet
Ansichten: 9

4 Antworten

Nach einem Jahr scheint es keine Lösung für mein Problem zu geben.

Ich füge diese Antwort hinzu, um zu sagen, dass ich damit leben muss ......

0
hinzugefügt

Sie erkennen, dass [ist ein Alias ​​(oft ein Link, symbolisch oder schwer) für /usr/bin/test , richtig? Vielleicht liegt das eigentliche Problem also in verschiedenen Versionen von /usr/bin/test ?

OTOH, ksh überschreibt es mit einem eingebauten. Vielleicht gibt es einen Weg, um es nicht zu tun? oder vielleicht können Sie [to /usr/bin/test explizit aliasieren, wenn /usr/bin/test auf allen Plattformen kompatibel ist?

0
hinzugefügt
[ist ein eingebauter Befehl sowohl in ksh93 als auch in pdksh ..
hinzugefügt der Autor Andrew Stein, Quelle

I wouldn't use pdksh on Linux anymore. Since AT&T ksh has become OpenSource there are packages available from the various Linux distributions. E.g. RedHat Enterprise Linux and CentOS include ksh93 as the "ksh" RPM package.

pdksh wird immer noch in vielen Installationsanforderungsdokumentationen von Softwareherstellern erwähnt. Wir haben pdksh auf allen unseren Linux-Systemen mit ksh93 bisher problemlos ersetzt.

0
hinzugefügt

In Bash ist der Test -a Operation für eine einzelne Datei.

Ich vermute, dass in Ksh88 der Test -a-Operation für eine einzelne Datei ist, aber nicht klagen, weil die anderen Testwörter eine unspezifizierte Bedingung für die -a sind.

Du willst etwas wie

for K in /etc/rc2.d/K* ; do test -a $K && echo heck-yea ; done

Ich kann sagen, dass ksh93 in dieser Hinsicht genauso funktioniert wie bash. Bedauerlicherweise denke ich, dass der Code schlecht geschrieben wurde, meine Meinung, und wahrscheinlich eine schlechte Meinung, da die Ursache des Problems der eingebaute ksh88-Test ist, der schlampigen Code erlaubt.

0
hinzugefügt