Stärken von Shell Scripting im Vergleich zu Python [geschlossen]

94

Ich habe einige Male versucht, Shell (Bash) -Skripte zu lernen, wurde aber von der Syntax verdrängt. Dann fand ich Python und konnte die meisten Dinge tun, die ein Shell-Skript in Python tun kann. Ich bin mir jetzt nicht sicher, ob ich meine Zeit mehr in das Erlernen von Shell-Skripten investieren soll. Also möchte ich fragen:

Was sind die Stärken von Shell-Skripten, die es im Vergleich zu Python zu einem unverzichtbaren Werkzeug machen?

Ich bin keine Systemadministration von Beruf, aber ich bin daran interessiert, Linux-Systeme für Heimanwender einzurichten. Daher denke ich, dass das Erlernen von Shell-Skripten notwendig werden kann.

Amol Gawai
quelle

Antworten:

82
  • Shell-Skripte haben einfachere Notationen für die E / A-Umleitung.
  • Es ist einfacher, Pipelines aus vorhandenen Programmen in der Shell zu erstellen.
  • Shell-Scripting verwendet ganze Programme wieder.
  • Shell ist universell verfügbar (unter Unix) - Python muss nicht unbedingt installiert sein.

Es ist wahr, dass Sie in Python alles tun können, was Sie in Shell tun können. Es ist auch wahr, dass es Dinge gibt, die in Python einfach sind, die hart in der Shell sind (genauso wie es Dinge gibt, die einfach in der Shell sind, aber schwer in Python). Beides zu wissen ist auf lange Sicht am besten.

Jonathan Leffler
quelle
16
1 und 2, gute Punkte. # 3 ist eine Schwäche, da es zu viel Overhead führt, den Python vermeiden kann. # 4 könnte weitgehend falsch sein. Python ist jetzt Teil der meisten Linux-Distributionen.
S.Lott
1
@Svante: Schreiben Sie eine einfache Shell-Schleife, um eine Reihe von Operationen mit Befehlen wie "test" und "expr" auszuführen, und vergleichen Sie die Laufzeiten mit einem Python-Skript, das das Modul "os" verwendet. Bei Befehlen wie test und expr wird häufig ein Unterprozess gegabelt, um die eigentliche Arbeit zu erledigen.
S.Lott
2
Ich sehe Punkt 3 als großen Vorteil, nicht als Nachteil. Ziehen Sie beispielsweise in Betracht, die Größe eines Verzeichnisses voller Bilder mit dem Konvertierungsprogramm zu ändern.
Glenn
7
In Bezug auf # 4 ist auch bemerkenswert, dass die bashShell nicht allgemein für alle Linux-Distributionen verfügbar ist, insbesondere für eingebettete Systeme und andere, auf denen die busyboxausführbare Datei ausgeführt wird. Skripte, die auf die bashabwärtskompatible Bourne-Shell selbst abzielen , können auf allen POSIX-kompatiblen Systemen ausgeführt werden. Diese Sprache ist jedoch wesentlich eingeschränkter als die von bash.
Intuitiert
5
@intuited: eval "$ (history 2 | head -1 | perl -pe 's / (? <= was ist) wahrscheinlicher / mindestens /')"; history -d $ (history 2 | head -1 | sed 's / ^ \ s * ([0-9] \ +) / \ 1 /')
intuitiv
54

"Was sind die Stärken von Shell-Skripten, die es im Vergleich zu Python zu einem unverzichtbaren Werkzeug machen?"

Die Schale ist nicht unverzichtbar. Warum denkst du, gibt es so viele? bash, tcsh, csh, sh usw. usw. usw.

Python ist eine Shell. Nicht die, die Sie zum Ausführen aller Befehle verwenden würden, aber für die Skripterstellung ist sie ideal.

Python ist ein mehr oder weniger Standardbestandteil aller Linux-Distributionen.

Die traditionelleren Muscheln machen zu viele Dinge.

  1. Sie haben eine praktische Benutzeroberfläche zum Ausführen von Befehlen. Dies umfasst einzeilige Befehle, bei denen die Shell Ihren PATH durchsucht, das angeforderte Programm gabelt und ausführt. Es enthält auch Pipelines, Sequenzen und gleichzeitig Programme (unter Verwendung ;, |und &) sowie einige Umleitung (mit >und <).

  2. Sie haben eine miese kleine programmiersprachenähnliche Fähigkeit zum Ausführen von Skripten. Diese Sprache ist ziemlich schwer zu benutzen und äußerst ineffizient. Die meisten Anweisungen in dieser Sprache erfordern das Verzweigen eines oder mehrerer zusätzlicher Prozesse, wodurch Zeit und Speicher verschwendet werden.

Programme von der Shell ausführen, stderr in eine Protokolldatei umleiten und so etwas ist gut. Mach das in der Shell.

Fast alles andere kann als Python-Skript effizienter und klarer ausgeführt werden.

Du brauchst beides . Sie sollten jedoch niemals ein Skript mit if-Anweisungen oder Schleifen in einer traditionellen Shell-Sprache schreiben.

S.Lott
quelle
1
@intuited. A) Die Verbreitung verschiedener Schalen bestätigt die Anzahl der Merkmale, die sich zu "Schalen" entwickeln. Es ist keine wesentliche Rolle, aber es ist das Allheilmittel für Funktionen. B) Der Python-Interpreter ist eine richtige Unix-Shell, er verwendet #!. C) Bei einer "einfachen" Shell- ifAnweisung wird häufig das testProgramm ausgeführt. Die Shell ist in jeder Hinsicht eine miese Programmiersprache.
S.Lott
4
@S. Lott: Scheint, als ob hier eine semantische Dissonanz in der Schaltung steckt. Meine Definition einer UNIX-Shell wäre ein Interpreter, dessen Sprache in erster Linie darauf ausgerichtet ist, den Betrieb eines UNIX-Systems auf hoher Ebene zu steuern. Nach dieser Definition ist eine Art Shell für den Betrieb eines UNIX-Systems sicherlich unerlässlich, und Python ist nicht qualifiziert. Wie würden Sie diesen Begriff definieren?
Intuitiert
1
@ S.Lott: Ich bin kein großer Fan der Syntax, die in herkömmlichen Shell-Skripten verwendet wird, aber ich finde sie ziemlich brauchbar und in vielen Situationen geeignet, in denen das Hauptziel darin besteht, Prozesse und den Ablauf ihrer Ausgabe zu steuern. Dies erfordert häufig Entscheidungen und Iterationen. Moderne Shells bashverfügen ( zumindest) über integrierte Funktionen für die Entscheidungsfindung (z. B. testsind sie integrierte bashFunktionen, zusätzlich zu vielseitigeren Konstrukten). Es hat sicherlich seine Schwächen, aber auch seine Stärken. Es lohnt sich auch, im Detail zu lernen, da es sich um ein ganz anderes Paradigma handelt als andere Arten von Sprachen.
Intuitiert
1
@intuited: "finde es ziemlich brauchbar" ist ein Gruß an deine Fähigkeiten, nicht an die miese Sprache. Python kann von weniger nützlichen Personen besser verwendet werden.
S.Lott
3
@ S.Lott: Interessant, Sie haben eine ganz andere Philosophie als ich. Ich denke, dass Design und Betrieb im Grunde Hühner und Eier sind. Dies bedeutet, dass ein Shell-Skript ein Programm ist, das Programme ausführt. Viele dieser Programme wurden ursprünglich als immer komplexere Shell-Skripte implementiert. Irgendwann hat es sich gelohnt, wahrscheinlich sowohl aus Gründen der Effizienz als auch der Modularität, einige von ihnen in C und später in Python neu zu schreiben. Zum Beispiel: irgendwann cat "$1" | ssh "$2" "cat - >\"$1\""gezeugt scp. Sie wussten, wie man es am besten entwirft, weil sie es bereits benutzten.
Intuitioniert
31

Die Shell macht allgemeine und einfache Aktionen wirklich einfach, auf Kosten komplexerer Dinge viel, viel komplexer.

In der Regel ist ein kleines Shell-Skript kürzer und einfacher als das entsprechende Python-Programm, aber das Python-Programm akzeptiert Änderungen ordnungsgemäß, während das Shell-Skript beim Hinzufügen von Code immer weniger wartbar wird.

Dies hat zur Folge, dass Sie für eine optimale tägliche Produktivität Shell-Skripte benötigen. Sie sollten diese jedoch hauptsächlich für Wegwerfskripte verwenden und Python überall verwenden.


quelle
14

Mit Shell-Skripten können Sie nichts tun, was Sie mit Python nicht tun können. Der große Vorteil von Shell-Skripten besteht darin, dass Sie dieselben Befehle verwenden wie bei der Verwendung der Shell. Wenn Sie also ein schwerer Shell-Benutzer sind, wird Shell-Scripting irgendwann zu einer sehr schnellen und einfachen Möglichkeit, Ihre Shell-Arbeit zu automatisieren .

Ich finde es auch einfacher, mit Datenpipes in Shell-Skripten umzugehen als in Python, obwohl dies mit Python absolut machbar ist.

Und schließlich müssen Sie keinen zusätzlichen Interpeter starten, um die Shell-Skripte auszuführen. Dies bietet Ihnen einen sehr kleinen, aber manchmal spürbaren Vorteil in Bezug auf Geschwindigkeit und Speichernutzung.

Andererseits sind Python-Skripte viel wartbarer. Ich versuche aus genau diesem Grund, von großen hässlichen Shell-Skripten zu Python-Skripten zu migrieren. Es ist auch einfacher, mit Python Ausnahmebehandlung und Qualitätssicherung durchzuführen.

elzapp
quelle
9

man muss kein Shell-Scripting lernen, wie alle vorherigen Antworten zeigen; Aber Lernen ist niemals eine schlechte Sache. Es ist wirklich eine Frage der persönlichen Prioritäten. Es ist sehr schwer für jemanden, Ihnen zu sagen, was Ihre Zeit wert ist und was nicht.

Die meisten Programmierer stellen fest, dass das Erlernen neuer Sprachen jedes Mal schrittweise einfacher wird. (Dasselbe gilt weitgehend auch für natürliche Sprachen.) Und je früher Sie beginnen, desto besser.

Plus: Wenn Sie eine Sprache gelernt haben, können Sie ihre Grenzen auf extravagante Weise aus einer Position des vollständigen Wissens und der Vertrautheit herauslösen. Das wird dich wahrscheinlich nicht fertig machen, könnte dir aber ein Bier von deinen Kollegen einbringen!

adrianrf
quelle
8

Ich stimme den meisten vorherigen Antworten zu. Ich halte Shell-Befehle für am besten geeignet für dateisystemorientierte Aufgaben (Kopieren und Verschieben von Dateien, grep usw.). Shell ist meiner Meinung nach besser, wenn Sie in eine Datei lesen und schreiben müssen, da eine einzelne >>file.txtUmleitung sofort an die Datei angehängt wird, anstatt beispielsweise file=open('file.txt','a'); file.write()usw. zu benötigen .

Derzeit mische ich für meinen persönlichen Gebrauch beides, erstelle ein Python-Skript und rufe jedes Mal os.system ('Befehl') oder os.popen ('Befehl') auf, wenn eine Aktion in der Shell einfacher ist als in Python.

Heltonbiker
quelle
6

Die Shell ist überall verfügbar. Wenn Sie sich an einen relativ einfachen Satz tragbarer Funktionen halten, können Ihre Skripte auf Mobiltelefonen, WLAN-Routern, DVRs, Netbooks, Workstations, großen Eisenservern und dergleichen ausgeführt werden. Python ist auf vielen Systemen nicht unbedingt sofort verfügbar, und je nach Umgebung kann es schwierig sein, es zu installieren.

Das Erlernen von Shell-Skripten kann Ihnen auch dabei helfen, einige Befehlszeilentricks zu erlernen, da die Befehlszeile die Shell ist. Es ist auch gut, wenn Sie eine ziemlich lange und komplizierte Befehlszeile benötigen und diese in ein allgemeineres Skript konvertieren, nachdem Sie festgestellt haben, dass Sie es noch mehr benötigen.

Die Shell hat auch einige ziemlich mächtige Funktionen; Pipelines sind ein wirklich interessantes Kontrollkonstrukt, das meines Wissens nur in der Shell vorkommt.

Brian Campbell
quelle
5

Eine andere Sache, die bei der Auswahl von Shell-Skripten von Python berücksichtigt werden muss, ist die Python-Version, die auf den Zielcomputern ausgeführt wird. RHEL5 (um nur einen zu nennen) wird es noch lange geben. RHEL5 steckt in Python 2.4 fest. Es gibt viele nette Bibliotheken, die von der Funktionalität abhängen, die Python nach 2.4 hinzugefügt wurde.

nscott
quelle