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
mv
Befehls in Bash ist
- Das Bash-Skript kann schneller ausgeführt werden - wahrscheinlich rufen Sie es von Bash aus auf und können
source
es 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.