Welche Ressourcen gibt es für die portable Shell-Programmierung? Die ultimative Antwort ist das Testen auf allen Zielplattformen, aber das ist selten praktikabel.
Die POSIX / Single UNIX-Spezifikation ist ein Anfang, gibt jedoch weder Aufschluss über den Grad der Unterstützung für die einzelnen Implementierungen noch über die gängigen Erweiterungen. Sie können die Dokumentation jeder Implementierung lesen, dies ist jedoch sehr zeitaufwendig und nicht vollständig korrekt.
Mir scheint, dass ein ideales Format eine von der Community kommentierte Version der POSIX-Spezifikation wäre, bei der jedes Feature durch seine Unterstützungsstufe zwischen den verschiedenen Implementierungen kommentiert wird. Gibt es so etwas? Oder gibt es andere nützliche Ressourcen?
Zum Beispiel gibt es Sven Maschecks Shell-Portabilitätsseiten , aber es geht nur um syntaktische Elemente und einige eingebaute Elemente und es werden nur alte Shells behandelt. Ich suche nach einer umfassenderen Ressource.
quelle
autoconf
undMetaconfig
(Perl,rn
) abrufen und alle Tricks und ihre erklärenden Kommentare an einem Ort sammeln.Antworten:
Das Autoconf-Handbuch enthält einen Abschnitt zur portablen Shell-Programmierung .
Obwohl dies nicht speziell auf POSIX abzielt, handelt es sich wahrscheinlich um die umfassendste Auflistung von Maßnahmen, die beim Versuch, portablen Shell-Code zu schreiben, zu treffen und nicht zu ergreifen sind.
quelle
Zusätzlich zu
dash
undposh
gibt esbournesh
(oderbsh
) die Heirloom Bourne Shell , mit der Bashisms erkannt werden können .Zum Heirloom-Projekt gehört auch "The Heirloom Toolchest", eine Sammlung von mehr als 100 Standard-Unix-Dienstprogrammen (die als Ausgangspunkt für den Vergleich von Befehlszeilenoptionen dienen können).
quelle
Versuchen Sie, ähnlich wie bei dieser Antwort , Ihr Skript in eleganter Form auszuführen .
Vergessen Sie auch nicht, die
POSIXLY_CORRECT
Umgebungsvariable auf true zu setzen, da dies dazu führt, dass sich viele Programme (nicht nur die Shell) strenger an die POSIX-Standards halten.quelle
Das Schreiben Ihrer Skripte mit dem Bindestrich könnte ein Anfang sein.
quelle
find
informiert hat nicht implementiert-exec +
).find
macht das-exec utility {} +
heutzutage.Bis zu einem gewissen Grad können Sie das
checkbashisms
Debian / Ubuntu-devscripts
Paket ausprobieren .Es ist nicht perfekt, aber es hat den Vorteil, ein existierender Ausgangspunkt zu sein. Zum Beispiel sieht es nicht die klassischen Störungen mit
sed
/ infind
Bezug auf die GNU vs BSD / andere Unterschiede.Standardmäßig ist es Debian + Bindestrich-orientiert, die
-p
Flagge kann in Ihrem Fall nützlich sein.quelle
Heutzutage finden Sie normalerweise eine POSIX-Shell auf einem System, und dies bedeutet im Allgemeinen, dass Sie Skripte in der POSIX-Sprache ausführen können (modulo führt zu Compliance-Fehlern).
Das einzige Problem ist, dass
/bin/sh
es manchmal keine POSIX-Shell gibt. Und Sie müssen die#!
Zeile in Skripten fest codieren, die sich als nette ausführbare Dateien verhalten sollen. Sie können den Benutzer nicht einfach auffordern, das Problem zu untersuchen und dann Ihr Skript als aufzurufen/path/to/posix/shell myscript
.Der Trick besteht also darin, POSIX-Funktionen in Ihrem Skript zu verwenden, das Skript jedoch automatisch die POSIX-Shell finden zu lassen. Eine Möglichkeit ist wie folgt:
Es gibt andere Ansätze, beispielsweise die Codegenerierung. Boostrapen Sie Ihre Skripte mit einem kleinen Skript, das eine Reihe von Skriptdateien ohne ein # enthält! Zeile und fügt eine hinzu.
Das Schlimmste, was Sie tun können, ist, ganze Skripte so zu schreiben, dass sie ab 1981 auf einer Bourne-Shell ausgeführt werden. Dies ist nur erforderlich, wenn Sie für ein System schreiben müssen, das wirklich keine andere Shell hat .
quelle