Deckt nur 1) Ihrer Frage ab.
Natürlich können APIs jederzeit nach Belieben ihrer Entwickler geändert werden und damit abhängige Software in jeder Sprache brechen. Die großartige Idee der I / O- "APIs" der Unix-Tools ist jedoch, dass es praktisch keine gibt (möglicherweise 0x0a
als Zeilenende). Ein gutes Skript filtert Daten mit den Unix-Tools, anstatt sie zu erstellen. Das bedeutet, dass Ihr Skript möglicherweise nicht mehr funktioniert, weil sich die Eingabe- oder Ausgabespezifikation geändert hat, aber nicht, weil sich das E / A-Format (auch hier gibt es nicht wirklich eines) der einzelnen im Skript verwendeten Tools geändert hat (weil etwas nicht wirklich vorhanden ist) kann mich nicht wirklich ändern).
Wenn ich eine Liste grundlegender Tools durchblättere, gibt es einige, die ich auch als Produzent einstufen würde , anstatt nur zu filtern:
- wc - Anzahl der Bytes, Wörter, Zeilen drucken - sehr einfaches Format, daher absolut unwahrscheinlich, dass es sich ändert, und außerdem nicht sehr wahrscheinlich, dass es in einem Skript verwendet wird.
- diff - es gibt verschiedene Ausgabeformate, aber ich habe keine Probleme gehört. Auch normalerweise nicht ohne Aufsicht verwendet.
- date - Jetzt müssen wir uns wirklich darum kümmern, was wir produzieren, insbesondere was das Gebietsschema des Systems betrifft. Ansonsten ist das Ausgabeformat RFC-fähig, da Sie es nicht genau angeben.
- cal - reden wir nicht darüber, ich weiß, dass das Ausgabeformat von System zu System sehr unterschiedlich ist.
- ls , who , w , last - ich kann nicht anders, wenn Sie ls analysieren wollen, es sollte einfach nicht sein. Auch wer, w, zuletzt, sind mehr interaktive Listener; Wenn Sie sie in einem Skript verwenden, müssen Sie darauf achten, was Sie tun.
- auf die zeit wurde in einem anderen post hingewiesen. Aber ja, es ist dasselbe wie bei ls. Mehr für den interaktiven / lokalen Gebrauch. Und die Bash-Version unterscheidet sich stark von der GNU-Version, und die GNU-Version hat seit vielen Jahren Fehler beseitigt. Verlasse dich einfach nicht darauf.
Die folgenden Tools erwarten ein bestimmtes Eingabeformat, das spezifischer ist als ein Byte-Stream:
- bc , dc - rechner. Bereits auf der hackigeren Seite der Dinge (wirklich, ich benutze sie nicht in Skripten) und vermutlich sehr stabile I / O-Formate.
Es gibt einen anderen Bereich mit einem viel höheren Bruchrisiko, nämlich die Befehlszeilenschnittstelle. Die meisten Tools haben unterschiedliche Funktionen sowohl auf den Systemen als auch auf der Zeitachse. Beispiele sind
- Alle Tools, die Regex verwenden - Regex kann die Bedeutung basierend auf dem Gebietsschema des Systems ändern (z. B. LC_COLLATE) und es gibt viele Feinheiten und Besonderheiten bei allen Implementierungen von Regex.
- Verwenden Sie einfach keine ausgefallenen Schalter. Sie können beispielsweise einfach
man 1p find
die POSIX-Such-Manpage anstelle der System-Manpage lesen. Auf meinem System muss manpages-posix installiert sein.
Und selbst wenn Sie solche Schalter verwenden, werden normalerweise keine subtilen Fehler verursacht, die Ihre Daten vergiften. Die meisten Programme lehnen es einfach ab, mit einem unbekannten Schalter zu arbeiten.
Abschließend würde ich sagen, dass Shell tatsächlich das Potenzial hat, eine der portabelsten Sprachen zu sein (es ist portabel, wenn Sie portabel schreiben). Vergleichen Sie mit Ihren bevorzugten Skriptsprachen, in denen subtile Fehler auftreten, oder mit Ihrem bevorzugten kompilierten Programm, das nicht mehr kompiliert werden kann.
An den seltenen Stellen, an denen ein Bruch aufgrund von Inkompatibilitäten auftreten kann, ist dies wahrscheinlich nicht auf die Zeit zurückzuführen, sondern auf die Verschiedenartigkeit der verschiedenen Systeme (was bedeutet, dass dies bei Ihnen 20 Jahre zuvor und in 20 Jahren der Fall war) , auch). Dies ist eine Folge der Einfachheit der Werkzeuge.