Welches ist das portabelste von sed, awk, perl und sh?

15

Kann jemand diese Tools in die richtige Reihenfolge bringen? Welche davon ist sicher auf selbst die minimalsten * nix - Systemen gefunden werden? Ist einer von ihnen zu 100% sicher anwesend? Ich vermute, dass die Reihenfolge wie folgt lautet:

  1. awk
  2. sed
  3. Sch
  4. perl

Ich stelle mir zwar vor, dass es Systeme gibt, die nicht standardmäßig eine Bourne-Shell verwenden, aber eine Shell wird standardmäßig vorhanden sein. Wird das immer so sein /bin/sh? Vermutlich nicht, wenn es sich nicht um eine Borowski-Shell handelt. Beide awkund sedhaben Seiten, die sie in der POSIX-Spezifikation erläutern, sodass sie vermutlich immer vorhanden sein werden. Ist das so? Kann ich sicher sein , dass beide auf einem * nix installiert werden? Einschließlich eingebetteter Systeme?

terdon
quelle
Eingebettete Systeme opfern oft die Portabilität, um minimal zu bleiben. Viele sind nicht POSIX-konform.
Jordan
@jordanm Heisst das , sie könnten möglicherweise nicht haben jede von diesen? Ich gehe von einem System aus, das mindestens eine minimale Shell-Schnittstelle bietet. Ich weiß, dass busybox bietet sh, awkund sedmein busybox-basiertes NAS hat beispielsweise auch Perl.
Terdon
1
Möglicherweise haben Sie sie, aber was sie tun, variiert je nach System, sodass die Frage, wie angegeben, wenig Sinn ergibt.
Stéphane Chazelas
@StephaneChazelas ah, könntest du mir dann helfen, es einzugrenzen? Kann man diese nicht danach sortieren, wie wahrscheinlich es ist, dass sie auf System X gefunden werden? Meine Erfahrung ist ausschließlich Linux und ein paar eingebettete NAS-Systeme. Ich weiß, dass Sie niemals ein GNU / Linux ohne all diese 4 bekommen werden, aber können Sie mir nicht eine Vorstellung davon geben, welches davon am sichersten ist, wenn es vorhanden ist?
Terdon

Antworten:

14

Welches ist das portabelste von sed, awk, perl und sh?

sed, shund awksind portabel, da sie von POSIX spezifiziert werden , und werden perlnicht von einem Standard unterstützt.

Kann jemand diese Tools in die richtige Reihenfolge bringen?

Wenn Sie sich an kompatiblen Code halten, sollte für die drei POSIX-Befehle keine Reihenfolge der Portabilität festgelegt sein.

Welche davon sind selbst auf den minimalsten * nix-Systemen zu finden?

Die drei POSIX-Programme und viele andere Dienstprogramme sind für ein POSIX-Betriebssystem obligatorisch. Einige Betriebssysteme fehlen aufgrund von Minimierung oder Bereitstellung unvollständiger / nicht konformer Implementierungen.

Tatsächlich würden die meisten (wenn nicht alle) kostenlosen und Open-Source-Unix-ähnlichen Betriebssysteme den Konformitätsprozess wahrscheinlich nicht bestehen, sollten sie es versuchen, und sie versuchen es sowieso nie.

Ist einer von ihnen zu 100% sicher anwesend?

Es würde mich überraschen, ein Betriebssystem wie * nix zu finden, dem eine Bourne-Shell auf Syntaxbasis fehlt, aber alles ist möglich, insbesondere bei eingebetteten Systemen.

Meine Vermutung ist, dass die Reihenfolge wie folgt ist: Einige Shell wird als Standard vorhanden sein, wird das immer bei / bin / sh sein?

/bin/shEs handelt sich wahrscheinlich um eine Shell der Bourne-Syntaxfamilie, es kann jedoch nicht garantiert werden, dass sie POSIX-kompatibel ist, auch nicht in POSIX-kompatiblen Systemen. Zum Beispiel ist es /usr/xpg4/bin/shunter Solaris 10 und älter, während /bin/shes sich um die ältere Original-Bourne-Shell handelt, die nicht POSIX ist.

jlliagre
quelle
12

Nehmen Sie einen Hinweis aus den Autotools: Halten Sie sich an den kleinsten gemeinsamen Nenner der Bourne- und POSIX-Shell - möglicherweise ergänzt durch sed-, wenn Sie etwas schreiben müssen, das überall funktionieren muss . Es kann Systeme geben, in denen etwas kaputt geht, aber Sie können solche Probleme umgehen, indem Sie sie neu schreiben.

Beispielsweise haben einige alte Systeme Probleme mit Erweiterungsfehlern test, auch bekannt als [:

 if [ $foo = bar ] ; then...

so ist die Autoconf Praxis neu zu schreiben , in doppelten Anführungszeichen mit einem einzelnen Zeichen - Präfix, etwa so:

 if [ x"$foo" = "xbar" ] ; then...

Sie könnten auch "x$foo"hier verwenden. Dies schützt vor der Möglichkeit, $foodass eine gültige Option für den Ausdruck sein könnte test(1), und da dies [ein Alias ​​für testihn ist, könnte sie ihn falsch interpretieren. Die Lösung besteht darin, eine Situation einzurichten, in der das unbekannte Argument [immer mit beginnt x, was bedeutet, dass es keine besondere Bedeutung haben kann [.

(Autoconf empfiehlt auch die Verwendung von testanstelle von [, aber dieser Rat kommt als Reaktion auf mögliche Konflikte mit M4 zustande , das auch [in seiner Syntax verwendet wird.)

awk ist POSIX und daher theoretisch überall verfügbar. Es ist sogar in Busybox enthalten , sodass Sie awkauch in einigen sehr restriktiven eingebetteten Linux-Systemen eine Implementierung haben . Dennoch wäre ich weniger überrascht, wenn ich auf ein System ohne awkals stoßen würde sed. Ich nehme an, es kommt auf die Komplexität an: Einfachere Werkzeuge überstehen mit größerer Wahrscheinlichkeit die aggressive Triage.

Perl ist kein Bestandteil eines weit verbreiteten Standards, weder POSIX noch eines anderen. Sie können sich also einfach nicht darauf verlassen, wenn Sie im Voraus nichts über die Zielumgebung wissen. Perl ist nicht standardmäßig installiert in:

  • Cygwin
  • FreeBSD und NetBSD
  • "Minimal" -Installationen für einige Linux-Betriebssysteme, einschließlich Slackware
  • viele eingebettete Linuxe, die in erster Linie auf Busybox als Benutzer angewiesen sind

Das Autoconf-Handbuch enthält ein Kapitel zur portablen Shell-Programmierung, das Ihnen hilfreich sein sollte. Die letzten Abschnitt behandelt Werkzeuge wie sed, awkund viele andere.

Warren Young
quelle
Vielen Dank, aber ich wundere mich über die Reihenfolge der Portabilität dieser. Wenn ich Sie richtig lese, schlagen Sie das vor shund sedsind am tragbarsten. OK, was ist mit den anderen? Und ist das shwirklich tragbar? Was ist, wenn die Standard-Shell ein C-Shell-Derivat ist? Wird ein solches System noch einen Symlink haben /bin/sh?
Terdon
Vielen Dank für die Bearbeitung, das ist die Sache, beide sedund awkwerden von busybox zur Verfügung gestellt, warum würden Sie mehr überrascht sein, wenn Sie sedabwesend sind? Haben Sie eine Idee, ob Busybox-Alternativen auch sed und awk bereitstellen?
Terdon
Re: POSIX vs Bourne Shell , schrieb den Rat um, sich an LCD der beiden zu halten. Betreff : Testzitat, ich habe den Grund dafür falsch gespeichert, aber das Kapitel im Autoconf-Handbuch gefunden, in dem der Grund behandelt wird, und die Antwort entsprechend bearbeitet. Re: sed vs awk und Busybox habe ich erklärt: größere Komplexität und Triage. sedTut weniger, daher ist seine Binärdatei kleiner, weshalb es weniger Gründe gibt, sie zu entfernen als awk, was ziemlich komplex ist. (20 kB vs 48 kB auf meinem System.) Re: Busybox-Alternativen , ich kenne keine andere One-Stop-Shopping-Alternative.
Warren Young
+1 Weil ich mit Ihrer allgemeinen shAnnahme einverstanden bin (dass der kleinste gemeinsame Nenner eine Art von - seltsamem - Terdon-Rang awkund seddarüber o_O ist?), Obwohl dies nur mit den Zwecken von Autotool zusammenfällt, da einige Umgebungen, insbesondere kleine, kann nicht für den Bau bestimmt sein, Zeitraum.
Goldlöckchen
1
@WarrenYoung das ist die Art von Sache, über die ich mich gewundert habe. Ich habe (hatte) keine Ahnung, ob auf allen * nix-Systemen standardmäßig eine bourne-Shell installiert ist. Wenn sie alle eine haben /bin/sh, dann sind die Dinge anders, aber ich wusste nicht , dass alle eine haben würden. Es tut mir leid, dass ich das im Übrigen nicht akzeptiert habe. Ich war zwischen den Antworten von dir und jlliagre hin und her gerissen. Beide haben meine Frage beantwortet. Ich habe seine gewählt, weil sie direkter angesprochen wurde und weil er weniger Repräsentanten hat :).
Terdon