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/bash
als 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 bash
und sind shell
austauschbar - 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?
quelle
bash
Tag versehen ist, kommentiert jemand "Es ist Bashismus und nicht tragbar". Wenn ich eine getaggte Frage beantworteC
, ist es mir egal, ob sie tragbar istJava
oder nicht.bash
bestimmte 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".Antworten:
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
bash
für Ihren shebang verwenden, können Sie davon ausgehen, dass das Skript mit ausgeführt wirdbash
. 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.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.
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.
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.
quelle
find
und 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.FIND=/opt/gnu/dispicable/bin/find
am Anfang Ihres Skripts einfügen und dann${FIND}
anstelle vonfind
in 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.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 /
rm
ErsatzMark 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.
quelle