Was ist der Vorteil von Shell-Skripten gegenüber interpretierten Programmiersprachen? [geschlossen]

15

(Ich bin nicht sicher, ob es eine angemessene Frage ist)

Shell-Skripte, wie die, die in geschrieben sind bash, können viele Dinge tun. Sie können Unix-Programme aufrufen, ihre Ausgabe leiten, E / A von / zu Dateien umleiten, den Ablauf steuern, prüfen, ob eine Datei vorhanden ist usw.

Aber auch eine moderne Programmiersprache, zB pythonund ruby, kann dies. Und sie sind (glaube ich) lesbarer und wartbarer.

bashgenießt breite Akzeptanz. Aber viele Distributionen haben auch pythonInterpreter installiert .

Was ist der Vorteil eines Shell-Skripts? Wenn ich schreiben könnte python, rubyoder perlist es wert , zu lernen bash?

Lai Yu-Hsuan
quelle
3
Wenn Sie viel mit Unix-Systemen arbeiten, sollten Sie Bash und die anderen beliebten Unix-Shells lernen.
Bernard

Antworten:

30

Shells verfügen über spezielle Funktionen zum Arbeiten mit Dateien und zum Abrufen von Daten von einem Programm in ein anderes (vorausgesetzt, es handelt sich bei den Daten um Text). Für diese Aufgaben können Shell-Skripte weniger umständlich sein als eine Skriptsprache wie Python.

Shell-Skripte haben auch den Vorteil, dass die Befehle, die Sie verwenden, im Grunde dieselben Befehle sind, die Sie über die Befehlszeile verwenden würden. Wenn Sie also etwas in der Shell tun können, sind Sie mehr als die Hälfte des Skripts für denselben Vorgang entfernt.

Hier ist zum Beispiel ein Bash-Skript, das alle PNG-Dateien aus dem aktuellen Verzeichnis in ein bestimmtes Verzeichnis verschiebt.

#!/usr/bin/sh
mv *.png $1

Hier ist eine Python-Version.

#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
    shutil.move(filename, sys.argv[1])

Sie werden feststellen:

  • Das Bash-Skript ist ein Drittel so lang wie das Python-Skript, wenn Sie Zeilen zählen (ohne die Shebang-Zeile) - noch weniger nach Zeichenanzahl
  • Für das Python-Skript müssen drei Bibliotheken importiert werden. Alles, was Sie für diese Aufgabe benötigen, ist nativ in bash verfügbar
  • Das Python-Skript benötigt eine explizite Schleife, um die Dateien zu verschieben, während dies Teil der Semantik des mvBefehls in Bash ist
  • Das Bash-Skript kann schneller ausgeführt werden - wahrscheinlich rufen Sie es von Bash aus auf und können sourcees in derselben Instanz der Shell ausführen
  • glob.iglob("./*.png") ist ein ziemlicher Bissen nur um es zu sagen *.png

Wenn Sie eine einfache Pipe-Operation in Python schreiben möchten, werden Sie über die Ausführlichkeit erstaunt sein. (Natürlich können einige Dinge, wie das Pipe-Through grep, durch Python-Code ersetzt werden, anstatt ein externes Programm zu verwenden. Daher müssen Sie häufig weniger Pipe-Vorgänge ausführen.)

Als Gegenbeispiel musste ich einmal eine Routine schreiben, die prüfte, wie lange sich die einzelnen Dateinamen in einem bestimmten Verzeichnis befanden. Wenn sie länger waren als von einem bestimmten Betriebssystem unterstützt, mussten sie gekürzt werden. Dies könnte zu doppelten Dateinamen führen, die ich korrigieren musste, und da sie von einer Webseite verlinkt wurden, mussten die verkürzten Namen stabil sein, dh sie sollten so generiert werden, dass immer derselbe lange Dateiname resultierte der gleiche verkürzte Dateiname. Ich habe dazu ein hexadezimales md5 des langen Dateinamens generiert und die ersten vier Zeichen davon an den verkürzten Namen angehängt (Namen konnten immer noch kollidieren, aber es war sehr unsinnig, also habe ich nur nach dieser Bedingung gesucht und eine Kaution verlangt, falls dies eintreten sollte). .

Ich habe dies in Bash gemacht, weil es Teil unseres Build-Systems war, das bereits in Bash geschrieben wurde. Es war genauso schwer, das Richtige zu finden, wie Sie wahrscheinlich denken. Das Schreiben in Python hätte viel weniger Zeit in Anspruch genommen und wäre wahrscheinlich auch klarer gewesen.

Kurz gesagt: Verschiedene Sprachen sind für verschiedene Arten von Aufgaben konzipiert. Wählen Sie die Sprache aus, die für die jeweilige Aufgabe am besten geeignet ist.

irgendwie
quelle
Sie können nicht dasselbe in Perl # / usr / bin / perl mv *.png $1tun (Kommentare behalten ihre Formatierung nicht bei), aber mit Perl können Sie auch Sprachfunktionen höherer Ebenen verwenden.
Poma
19

Die vorhandenen Antworten sind auch gültig, aber es gibt einen Grund, den noch niemand erwähnt hat: weil es dort sein WIRD.

Jede gegebene * nix-Installation wird mit einigen optionalen Paketen durchgeführt, die möglicherweise geladen werden oder nicht, und nicht alle Systeme werden Python oder Perl oder Ruby haben. Wenn jedoch erwartet wird, dass das System überhaupt interaktive Funktionen bietet, verfügt es über eine Shell. Dies bedeutet, dass Shell-Skripte auf Systemen von Servern über Programmier-Desktops bis hin zu Sekretariats-Thin-Client-Desktops und eingebetteten Geräten auf jedem System funktionieren, das ein beschreibbares Dateisystem und eine Bash-Befehlszeile unterstützt.

Für jemanden, der nur in einer konsistenten Serverumgebung arbeitet, ist dies eine Selbstverständlichkeit und nicht so wichtig. Für jemanden, der in einem abwechslungsreichen Umfeld arbeitet, sollte dies nicht übersehen werden.

Erik Johnson
quelle
9

Ein wesentlicher Teil Ihrer Frage wird hier beantwortet:

Warum sind Skriptsprachen (zB Perl, Python, Ruby) nicht als Shell-Sprachen geeignet?

Hier ist ein Auszug aus meiner Antwort auf diese Frage :

Es gibt ein paar Unterschiede, die ich mir vorstellen kann; hier nur Gedankenstrom, in keiner bestimmten Reihenfolge:

  1. Python & Co. sind so konzipiert, dass sie sich gut mit Skripten auskennen. Bash & Co. sind so konzipiert, dass sie nur gute Skripte erstellen können , ohne Kompromisse einzugehen. IOW: Python ist so konzipiert, dass es sowohl gut in Skripten als auch in Nicht-Skripten ist. Bash kümmert sich nur um Skripten.

  2. Bash & Co. sind untypisiert, Python & Co. sind stark typisiert, was bedeutet, dass die Nummer 123, der String 123und die Datei 123sehr unterschiedlich sind. Sie sind jedoch nicht statisch typisiert, was bedeutet, dass sie unterschiedliche Literale für diese haben müssen, um sie voneinander zu trennen. Beispiel:

    • Ruby: 123(Nummer), Bash:123
    • Ruby: '123'(String), Bash:123
    • Ruby: /123/(regulärer Ausdruck), Bash:123
    • Ruby: File.open('123')(Datei), Bash:123
    • Ruby: IO.open('123')(Dateideskriptor), Bash:123
    • Ruby: URI.parse('123')(URI), Bash:123
    • Ruby: `123`(Befehl), Bash:123
  3. Python & Co. sind für die Skalierung von bis zu 10000, 100000, möglicherweise sogar 1000000 Zeilenprogrammen ausgelegt. Bash & Co. sind für die Skalierung von bis zu 10 Zeichenprogrammen ausgelegt .

  4. In Bash & Co. sind Dateien, Verzeichnisse, Dateideskriptoren und Prozesse erstklassige Objekte. In Python sind nur Python-Objekte erstklassig. Wenn Sie Dateien, Verzeichnisse usw. bearbeiten möchten, müssen Sie sie in einen Zeilenumbruch einfügen Python-Objekt zuerst.

  5. Shell-Programmierung ist im Grunde genommen Datenflussprogrammierung. Niemand merkt das, nicht einmal die Leute, die Muscheln schreiben, aber es stellt sich heraus, dass Muscheln darin ziemlich gut sind und Allzwecksprachen nicht so sehr. In der universellen Programmierwelt wird der Datenfluss anscheinend hauptsächlich als Nebenläufigkeitsmodell betrachtet, weniger als Programmierparadigma.

Ich habe das Gefühl, dass der Versuch, diese Punkte durch Verschrauben von Funktionen oder DSLs mit einer Allzweck-Programmiersprache anzugehen, nicht funktioniert. Zumindest muss ich noch eine überzeugende Umsetzung sehen. Es gibt RuSH (Ruby-Shell), die versucht, eine Shell in Ruby zu implementieren, es gibt Rush, das ist ein internes DSL für die Shell-Programmierung in Ruby, es gibt Hotwire, das ist eine Python-Shell, aber IMO kommt keines davon auch nur annähernd mit Bash, Zsh, Fisch und Freunden zu konkurrieren.

Jörg W. Mittag
quelle
Defekter Link: Wo ist diese Frage (und Antwort), auf die Sie sich jetzt beziehen? Oder wurde hier alles Nützliche kopiert?
Wolf
1
@Wolf: Offensichtlich wurde es nach fast drei Jahren gelöscht, weil es nicht zum Thema gehörte. Das ist bedauerlich.
Jörg W Mittag
1
Hier ist eine archivierte Version dieser Frage: web.archive.org/web/20140528035940/http://stackoverflow.com/…
waldyrious
1

Ich würde sagen, ein Shell-Skript hat den Vorteil, wenn Sie nur eine supereinfache automatisierte Aufgabe ausführen möchten. Wenn Sie beispielsweise täglich um 5:00 Uhr ein Skript schreiben möchten, mit dem ein Verzeichnis von einem Server auf einen anderen gesichert wird, ist die Verwendung einer Hochleistungsprogrammiersprache ein Kinderspiel.

Wenn Ihre Programmieraufgabe dagegen eher Kontrollstrukturen (if / then / else), iterative Strukturen (Schleifen), Datenbank- und Datei-E / A usw. benötigt, ist sie wahrscheinlich besser für eine leistungsfähigere Aufgabe geeignet Programmiersprache als ein Shell-Skript.

Ich denke, eine gute Faustregel ist:

automatingSimpleTask ? shellScript() : programmingLanguage();
CFL_Jeff
quelle
2
Sollte es nicht shellScript() if automatingSimpleTask else programmingLanguage() lol sein.
Gahooa
1
@ gahooa haha ​​zeigt auf welcher Seite des Zauns ich bin!
CFL_Jeff
1

Während Sie Programme von einem Python / Ruby / beliebigen Programm starten können, ist dies in der Shell anders. Möglicherweise müssen Sie eine API verwenden, um etwas zu starten - beispielsweise fork (). In einem Shell-Skript verhalten sich Programme eher wie Funktionen in einer herkömmlichen Programmiersprache und können mit minimalem Aufwand ausgeführt, weitergeleitet usw. werden. Auch mit Pipes ist der Datenfluss sehr übersichtlich.

Phkahler
quelle
0

Wenn Sie die Programmiersprache, die Sie für bestimmte Aufgaben verwenden, völlig frei wählen können, könnten Sie wahrscheinlich das Erlernen von Bash fast vollständig vermeiden und jede Skriptprogrammierungsaufgabe mit Perl, Python oder Ruby ausführen. Dies kann manchmal zu einer ausführlicheren Lösung führen, insbesondere dann, wenn Sie nur ein Skript benötigen, das eine Sequenz anderer Unix-Tools aufruft. In komplexeren Fällen können Sie mit diesen modernen Skriptsprachen jedoch besser verwaltbaren Code schreiben (Sie geben Ihnen auch mehr Möglichkeiten, verschleierten Code zu schreiben, aber das ist Ihre Wahl).

Andererseits können wir die Sprache, die uns am besten gefällt, oft nicht frei wählen, da wir mit Legacy-Code oder Code arbeiten müssen, der von jemandem geschrieben wurde, der Bash kannte, aber keine der von Ihnen genannten Skriptsprachen kannte.

Doc Brown
quelle
0

Shell Scripting ist eine interpretierte Programmiersprache. Hier sind einige Gründe, warum ich mich dazu entschlossen habe, Skripte in Bash anstelle von Perl oder Python oder einer anderen Skriptsprache zu schreiben:

Funktioniert überall : Komplexere Interpreter sind möglicherweise nicht immer verfügbar, z. B. während des Systemstarts oder auf eingebetteten Systemen. Bash ist auch in der Busybox verfügbar.

Funktioniert in der Befehlszeile : Wenn Sie mit Shell-Skripten vertraut sind, können Sie diese Fähigkeiten verwenden, um komplexe Aufgaben in Ad-hoc-Skripten direkt in der Befehlszeile auszuführen. Ich benutze diese Fähigkeit täglich als Sysadmin.

Einfacheres Schreiben von Programmen, die andere Programme aufrufen: Wenn Sie versuchen, mehrere vorhandene Programme auf interessante Weise miteinander zu verketten, ist die Ausführung in einem Shell-Skript möglicherweise einfacher als in einer höheren Sprache.

Wenn das Programm 30 Zeilen oder weniger enthält, schreibe ich es normalerweise mithilfe von Shell-Skripten. Wenn es um komplexe Manipulationen oder komplexe Analysen geht, mache ich das mit Python oder Perl.

tylerl
quelle
-1

Sie sollten sich Coffeescript ansehen. Ihre Worte:

Unter all diesen umständlichen Klammern und Semikolons hatte JavaScript immer ein großartiges Objektmodell im Mittelpunkt. CoffeeScript ist ein Versuch, die guten Teile von JavaScript auf einfache Weise darzustellen.

Die goldene Regel von CoffeeScript lautet: "Es ist nur JavaScript".

Nun ... hier kommt die Super-Anfänger-Antwort.

Als Anfänger mit automatischem Lernen in den letzten 6 Monaten und mit ein wenig C, C ++, Javascript und mehr Bashscript in den letzten Tagen ... kann ich Ihnen sagen:

Shell-Skripte, wie die in Bash geschriebenen, können viele Dinge tun. Sie können Unix-Programme aufrufen, ihre Ausgabe leiten, E / A von / zu Dateien umleiten, den Ablauf steuern, prüfen, ob eine Datei vorhanden ist usw.

und ist das nicht einfach fantastisch? ? Schleifen und Variablen? Beeindruckend!

Python und Ruby können diese Dinge auch. Und sie sind (glaube ich) lesbarer und wartbarer.

Bitte sag mir, wo du das siehst. Ich habe bashscript in gedit geschrieben, auch in geany, und ich kann formatieren (tabs?) Und ich lese meinen Code in Lichtgeschwindigkeit mit bashscript im Vergleich zu anderen Sprachen.

Verfügt diese Sprache über andere Tools, um Ordnung zu halten? Ich weiß, objektorientiert viel Code zu speichern, aber ... die Leute sagen, BashScript ist auch OO! WOW 2! Das ist mein Punkt hier. Gehe zu:

Der Vorteil von Shell ein Skript

befindet sich in dieser Frage: Wie kann man mit Perl, Phyton oder Ruby tun, was dieses blöde Zeug kann? Es ist einfach?

( bashdamnthing = xdotool )

H_7
quelle
WTF ist hier los? Es ist wie eine Doge Antwort ..
naught101