TL;DR - Bash nur verwenden für die Installation einer besseren Sprache (falls sie nicht bereits verfügbar ist), sonst verschwenden Sie unwiederbringliche, kostbare menschliche Zeit. Wenn Sie es auf der Befehlszeile nicht fehlerfrei von Hand machen können, schreiben Sie kein Skript mit Bash/Shell.
Es ist 2015, also würde ich Folgendes in Betracht ziehen:
-
Speicheraufwand
- Ruby/Python-Laufzeit-Speicher-Overhead im Vergleich zu Bash ist winzig (aufgrund gemeinsam genutzter Bibliotheken), während man wahrscheinlich sowieso kein nicht-triviales Bash-Skript verwalten kann (d. h. eines mit> 100 Zeilen) - also ist die Speichernutzung kein Problem Faktor
-
Startzeit
- Der Start von Ruby/Python ist vielleicht etwas langsamer, aber wahrscheinlich werden Sie nicht viele vollständige Ruby/Python-Prozesse in einer engen Schleife 100 Mal pro Sekunde ausführen (wenn Sie solche Anforderungen haben, bash /shell ist sowieso zu viel Overhead und Sie müssen wahrscheinlich auf C/C++ umsteigen)
-
Leistung
- fast alle typischen Datenverarbeitungen werden in Ruby/Python schneller sein - oder zumindest vergleichbar (oder Sie brauchen sowieso C/C++/Haskel/OCaml/was auch immer)
- Die tatsächliche Leistung/Engpass bei der Ausführung (oder sogar Produktivität) wird fast niemals auftreten sei "ein Mangel an Verwendung von Bash/Shell" (selbst Ubuntu, der dash für den Start wechselt, zeigt, dass Bash tatsächlich das Problem ist - und eine Busybox ist wahrscheinlich der einzige Anwendungsfall, weil es gibt nicht mehr als „bash“ und „vi“, um Code zu schreiben und auszuführen, und es gibt oft keine Möglichkeit, etwas anderes hinzuzufügen/herunterzuladen oder zu speichern)
- Das Ausführen anderer Prozesse zur Erledigung der Aufgabe (wie sed/awk/grep) ist tatsächlich um eine Größenordnung langsamer als das Aufrufen einer Methode für ein aktives Objekt im Speicher
-
Produktivität
- Es ist zu einfach, Fehler in Bash/Shell zu machen, verglichen mit der Verwendung von "echten" Methoden, Parametern, Variablen und Ausnahmen in Ruby/Python
- Agile ist Mainstream, während Bash keine Unterstützung dafür hat (fehlende Unit-Testing-Fähigkeiten, Bibliotheken, OO, Modularität, Linting, Introspektion, Protokollierung, Metaprogrammierung; fast unmöglich umzugestalten, ohne etwas zu beschädigen)
- Viel zu viele Inkompatibilitäten mit anderen Shells, kleinere Umgebungsvariablen können ein Skript komplett kaputt machen (und einige wichtige Dev-Ops-Tools wie Puppet ignorieren Shebang-Zeilen und geben wichtige Shell-Variablen weiter oder schreiben sie um), während Ruby/Python gut definierte relativ reibungslose Migrationspfade selbst bei größeren Versionsänderungen
- Das Erlernen einer neuen Sprache nimmt aufgrund Shell-spezifischer Probleme (insbesondere - Variablennamen, keine booleschen Werte, keine Ausnahmen usw.) einen Bruchteil der Zeit in Anspruch, die alternativ zum Debuggen von Shell-Skripten aufgewendet wird.
- Sogar Startskripte sind eine Landmine (insbesondere weil sie während system fehlschlagen können startup), und angesichts der jüngsten Sicherheitslücken mit Bash sind Sie möglicherweise besser dran, einfaches C (mit guten Bibliotheken) zu verwenden - ja, C muss kompiliert, konfiguriert usw. werden, aber selbst ein einfaches Shell-Skript benötigt möglicherweise ein Repository und dann eine Versionierung , dann Verpackung sowieso.
- alles, was mit sed/awk/grep verfügbar ist, ist wahrscheinlich bereits in Ruby/Python integriert - ohne dass es eine Abhängigkeit oder "Unterschiede" zwischen Versionen dieser Tools auf verschiedenen Plattformen gibt (also was, wenn es auf Ihrem Einrichtung)
- Arbeitsplatzsicherheit
- Welchen Sinn hat es, sich einen Job zu sichern, den man nicht mag? (es sei denn, Sie lieben es, all diese Stunden damit zu verbringen, schwer zu debuggende, aber trivial zu machende Shell-Skriptfehler zu finden)
Ich finde, es gibt keinen Grund, Bash/Shell zu verwenden, wenn Sie Ruby/Python installiert haben.
Und um Ruby/Python zu installieren, ist wahrscheinlich nicht einmal ein Bash-Skript erforderlich (mit Ausnahme von busybox sind einige Systemtools ohnehin davon abhängig, dass Python/Perl vorhanden ist).
Und jedes Mal, wenn Sie ein Shell-Skript schreiben, "üben" Sie genau das - anstatt etwas Mächtigeres/Produktiveres zu lernen.
Warum verwenden die Leute heutzutage Bash? Weil es eine schreckliche, schwer zu brechende Angewohnheit ist. Ein Drehbuch ist selten nach den ersten Minuten „für immer fertig“ – egal, wie stark die Leute dazu neigen, so zu denken. Zusammen mit dem Fehlschluss "es ist der letzte Fehler in diesem Skript".
Fazit:Verwenden Sie Bash/Shell nur, wenn Sie absolut gezwungen sind bis (wie ~/.bashrc
, busybox), weil es fast nie ist "das richtige Werkzeug für den Job" heutzutage.
Bei einem Problem, das beide bewältigen können, sollten Sie das verwenden, mit dem Sie sich am wohlsten fühlen. Letztendlich sind es viele kleine Details, die man nur durch Erfahrung erkennen kann.
Bash ist eine Allzweck-Skriptsprache, genau wie Python, Ruby, Perl, aber jede hat unterschiedliche Stärken gegenüber den anderen. Perl zeichnet sich durch Textanalyse aus, Python behauptet, das eleganteste von allen zu sein, Bash-Skripte eignen sich hervorragend zum "Rohren von Sachen", wenn Sie verstehen, was ich meine, und Ruby ... nun, Ruby ist in vielem etwas Besonderes von Wegen.
Die Unterschiede zwischen ihnen sind jedoch nur dann wirklich von Bedeutung, wenn Sie über eine gesunde Menge an Skripterfahrung verfügen. Ich schlage vor, Sie wählen eine Sprache aus und bringen sie an ihre Grenzen, bevor Sie zur nächsten übergehen. Sie können viel in einem Shell-Skript tun, mehr als die meisten Leute zugeben würden. Jede Sprache ist so schwer, wie Sie es wollen. Nachdem Sie ein paar Dinge hineingeschrieben haben, fällt Ihnen jede Sprache "einfach".
Mit der Shell vertraut zu sein, zahlt sich schnell aus, wenn Sie mit Linux leben, also möchten Sie vielleicht damit beginnen. Wenn Sie eine Aufgabe finden, die in einem Shell-Skript unmöglich oder unpraktisch zu lösen ist, verwenden Sie etwas anderes.
Denken Sie auch daran, dass das Erlernen von Shell-Scripting sehr einfach ist. Die wirkliche Stärke liegt in anderen Programmen wie awk, sed, tr usw.
Ich verwende Bash, wenn mein Hauptaugenmerk auf der Dateiverwaltung liegt. Dies kann das Verschieben, Kopieren und Umbenennen von Dateien sowie das Verwenden von Dateien als Eingabe für andere Programme oder das Speichern der Ausgabe anderer Programme in Dateien umfassen. Ich schreibe selten Bash-Code, der tatsächlich den Inhalt einer Datei untersucht oder die Ausgabe generiert, um in eine Datei zu schreiben; Das überlasse ich den anderen Programmen (die ich vielleicht in Perl oder Python schreibe), die ich per Bash starte.
Ich verwende Perl und Python, wenn ich mich hauptsächlich darauf konzentriere, Daten aus Dateien zu lesen, diese Daten auf irgendeine Weise zu verarbeiten und Ausgaben in Dateien zu schreiben. Wenn ich (in Perl) den system
verwende Befehl, Backticks oder (in Python) der subprocess
Modul zu umfangreich, überlege ich, das Skript in bash zu schreiben. Auf der anderen Seite füge ich manchmal einem Bash-Skript so viele Funktionen hinzu, dass es schließlich sinnvoller ist, es in Perl/Python neu zu schreiben, anstatt sich mit der (im Vergleich dazu) eingeschränkten Unterstützung von Bash für Variablenbereich, Funktionen, Datenstrukturen usw .