Wann ist es wichtig, tragbare Skripte zu schreiben?

18

Der meiste Code, den ich schreibe, ist in PHP. Ich habe vor kurzem angefangen, Shell-Scripting zu lernen. Die meisten Ressourcen und Tutorials, auf die ich gestoßen bin, sind spezifisch für Bash. Einige warnen vor Bashismen und andere nicht. Ich habe hier viel gelesen und Stapelüberlauf.

Wann immer eine Antwort Bashismen verwendet , wird jemand unweigerlich kommentieren, um zu sagen:

Sie sollten <bashism hier einfügen> nicht verwenden. Es ist nicht tragbar.

Dies geschieht auch dann, wenn die Frage mit einem Tag versehen wurde bash. Für mich ist das so, als würde man einem PHP-Programmierer sagen, dass er keinen Code verwenden soll, der neu in PHP 5 ist, weil er nicht mit PHP 4 verwendet werden kann unter Windows.

Wenn ich in PHP schreibe , wähle ich eine Mindestanforderung und schreibe vorwärtskompatiblen Code. Ich mache mir keine Sorgen, ob ich es abwärtskompatibel mache.

Wenn ich #!/bin/bashals Schekan benutze, warum sollte ich dann keine Bashismen benutzen? Ich fange an, den Eindruck zu bekommen , dass einige Leute wie zu bash bashisms (Wortspiel beabsichtigt) , nur um von ihm.

Die Benutzer verwenden sie häufig bashund sind shellaustauschbar - wahrscheinlich aufgrund der Tatsache, dass bash auf vielen Systemen die Standard-Shell ist. Daher kann ich verstehen, dass ein Kommentar hinzugefügt wird, um zu warnen, dass der Code Bashismen verwendet, aber ich verstehe nicht, dass es falsch ist , sie zu verwenden.

Wenn ich ein Skript ausschließlich für den persönlichen Gebrauch schreibe, kann ich es natürlich in jeder gewünschten Sprache schreiben. Aber ich würde gerne glauben, dass ein Teil des Codes, den ich schreibe, für andere nützlich sein könnte.

Ich habe vor dem Posten versucht, eine Antwort auf meine Frage zu finden. Ich fand eine Menge von Informationen über , wie zu testen , für die Portabilität, aber kann nichts finden , wenn es wichtig ist, dies zu tun.

Wann ist es also wichtig, tragbare Skripte zu schreiben?

Beispielsweise,

  • Welche Arten von Skripten sollten so portabel wie möglich sein?
  • Wie häufig sind Systeme ohne Bash installiert?
  • Wenn auf dem System Bash installiert ist, enthält es dann auch die GNU-Version von find und anderen Dienstprogrammen?
Toxalot
quelle
4
Ich habe diese Frage positiv bewertet und beantwortet, aber je mehr ich darüber nachdenke, desto besser passen nur die letzten beiden Fragen zur Website. Die anderen sind "primär meinungsbasiert".
Jordanien
1
Es gibt auch einen Meta-Aspekt in dieser Frage: Auch wenn dies bei der ersten Beantwortung der Frage möglicherweise nicht hilfreich ist, können Kommentare wie "Dies ist nicht portabel" für andere Leser sehr hilfreich sein, die Monate oder Jahre später über die Frage / Antwort stolpern.
Bananguin
2
@ Bananguin Kommentare sagen "das ist nicht tragbar" stören mich nicht. Das ist nur eine FYI. Ich habe diese Art von Kommentaren selbst gemacht. Es ist das "Du solltest nicht ...", das mich stört. Dies impliziert, dass mit der Antwort etwas nicht stimmt. Das wäre gültig, wenn in der Antwort beispielsweise veralteter Code empfohlen würde. Also habe ich mich gefragt, was mit Bash los ist.
Toxalot
2
+1. Besonders wenn die Frage nur mit einem bashTag versehen ist, kommentiert jemand "Es ist Bashismus und nicht tragbar". Wenn ich eine getaggte Frage beantworte C, ist es mir egal, ob sie tragbar ist Javaoder nicht.
PP
4
Ich finde es immer gut, darauf hinzuweisen, dass es sich um eine bashbestimmte Funktion handelt und nicht portabel ist, genauso wie ich darauf hinweisen möchte, dass für ein Hilfsprogramm eine GNU-spezifische Erweiterung verwendet wird (obwohl die Frage als Linux gekennzeichnet war). Ich habe noch nie jemanden sagen sehen "Das ist ein Bashismus und du solltest ihn niemals benutzen".
Martin Tournoij

Antworten:

15

Als Mitglied dieser Gemeinschaft sehe ich nicht oft Leute, die Bashismen für Dinge missachten, die auf Bash abzielen. Wenn es um Portabilität geht, sind GNUisms viel schlimmer als Bashisms. Solange Sie bashfür Ihren shebang verwenden, können Sie davon ausgehen, dass das Skript mit ausgeführt wird bash. Sie können die Version jedoch nur garantieren, wenn Sie dies ausdrücklich prüfen. Bash Version 4 brachte einige nützliche Funktionen mit sich, wie zum Beispiel assoziative Arrays, aber Bash v3 wird unter OS X und RHEL 5 immer noch häufig verwendet.

Welche Arten von Skripten sollten so portabel wie möglich sein?

Hier geht es mehr um Ihre Bedürfnisse und darum, was Sie als Entwickler unterstützen möchten. Wenn Sie ein Installationsskript für eine Anwendung schreiben, die alle Arten von * NIX unterstützt, ist die Portabilität sehr wichtig.

Wie häufig sind Systeme ohne Bash installiert?

FreeBSD und Solaris 10 sind Beispiele für Systeme, auf denen bash nicht standardmäßig installiert ist. Die meisten Linux-Systeme, mit Ausnahme von Embedded-Systemen, werden es haben.

Wenn auf dem System Bash installiert ist, enthält es dann auch die GNU-Version von find und anderen Dienstprogrammen?

Nein, und das ist das eigentliche Problem bei der Portabilität. Wenn Portabilität wichtig ist, sollten Sie nur Shell-Befehlsfunktionen verwenden, die durch den POSIX-Standard definiert sind. GNU-Dienstprogramme können auf Nicht-GNU-Systemen wie FreeBSD installiert werden, aber es ist unwahrscheinlich, dass sie in PATH an erster Stelle stehen, und Sie können sich nicht auf die zu installierenden Tools verlassen.

Jordanien
quelle
1
Ich denke, es geht mehr um SO als hier, wo ich oft Leute sehe, die Bashismen missachten . Ich weiß nur, dass ich es oft genug bemerkt habe, um mich zu frustrieren und mich aufzufordern, diese Frage zu stellen.
Toxalot
1
Wenn GNU-Dienstprogramme installiert sind, aber nicht zuerst in PATH, gibt es eine Möglichkeit, sie speziell aufzurufen? Warum haben Sie sie sonst überhaupt installiert?
Toxalot
@toxalot: Binärdateien und Skripte werden explizit unter Verwendung absoluter Pfade aufgerufen.
Bananguin
1
@Bananguin Wenn also jemand Bash- und GNU-Dienstprogramme installiert hätte (aber nicht in PATH), könnte er das Skript verwenden, wenn er es bearbeitet, um absolute Pfade für findund für welche anderen GNU-spezifischen Dienstprogramme zu verwenden, die ich verwendet habe? Offensichtlich wäre das für ein Installationsskript nicht benutzerfreundlich. Aber ich denke darüber nach, einfach etwas auf GitHub zu setzen, das andere greifen können, wenn sie dies wünschen. Es ist mir egal, dass es nicht auf jedes System portierbar ist. Ich möchte nur nicht, dass es auf vielen Systemen nutzlos ist.
Toxalot
1
@toxalot: ja das könnte funktionieren. Wenn Sie etwas wie FIND=/opt/gnu/dispicable/bin/findam Anfang Ihres Skripts einfügen und dann ${FIND}anstelle von findin Ihrem Skript verwenden, geben Sie den Leuten einen (!) Platz, um ihre Installationspfade einzufügen und Ihr Skript dazu zu bringen, die richtigen Tools zu verwenden.
Bananguin
5

Wann ist es also wichtig, tragbare Skripte zu schreiben?

Welche Arten von Skripten sollten so portabel wie möglich sein?

Wenn Sie sie für Ihre Arbeitsumgebung verwenden und auf verschiedenen Maschinen arbeiten (oder in Zukunft könnten) - UND Sie möchten nicht, dass Ihre Werkzeuge neu geschrieben werden müssen, bevor Sie sich an die Arbeit machen.

zB: ein Trash-Skript / rmErsatz


Mark Stewart:

... für mein Troubleshooting Toolkit gehe ich davon aus, dass ich nur vi und Korn Shell haben werde. Und ich versuche, Befehle zu verwenden, die auf den meisten Unix-Varianten funktionieren.

user3082
quelle
3
Ich mag einige der kniffligen "Bash-Isms", aber für mein Toolkit zur Fehlerbehebung gehe ich davon aus, dass ich nur vi und Korn-Shell haben werde. Und ich versuche, Befehle zu verwenden, die auf den meisten Unix-Varianten funktionieren. Auf diese Weise bin ich bereit, die Suche auf einem kranken System durchzuführen, ohne mich darum kümmern zu müssen, wie sich der Befehl ps verhält, ob Bash oder Perl oder PHP vorhanden ist oder wo sie sich befinden.
Mark Stewart