Welche Skriptsprache für Kommandozeilenautomatisierung unter Linux und Windows

(Last Updated On: 12. Juli 2015)

In letzter Zeit haben Sie schon ein paar Posts von mir gesehen, die sich mit der Automatisierung bestimmter Aufgaben beschäftigen, etwa meinen Post über Cygwin, über Browserskripte, oder über automatisierte Backups.

Für viele stellt sich hierbei zuvor immer eine Entscheidungsfrage, welche Aufgaben man mit welcher Skriptsprache automatisieren sollte. Es ist immer sehr enttäuschend, eine Stunde oder mehr Zeit in das Coden einer automatiiserungsarbeit aufzuwenden und später festzustellen, dass die verwendete Skriptsprache nicht mächtig genug ist, um alle Anforderungen abzubilden.

Unix und Linux: Shell/Bash vs Perl-Skripte

Unter den Betriebssystemen Linux und Unix haben sich zur Automatisierung zwei Technologien durchgesetzt: Shell-Skripte, die aufgrund der am häufigsten verwendetn Shell zu diesem Zweck häufig auch Bash-Skripte heißen, gegen die Skriptsprache Perl. Absolute Linux-Geeks mit langen Gandalf-Bärten, die bis zum Boden reichen, programmieren vielleicht Skripts in Generation-4-Programmiersprachen wie C++, das ist aber meist ein zu hoher Aufwand, um Automatisierungsarbeiten zu coden. Perl hingegen kann Systemarbeiten genau so einfach und aber auch umfangreich automatisieren wie ein Bash/Shell-Skript es kann. Ein Perl Skritp zu erstellen ist grundsätzlich genau so einfach und schwer wie das Erstellen eines Shell-Skripts.

Grundsätzlich  ist es in Perl beispielsweise einfacher, Textverarbeitungstasks zu automatisieren, also besitmmte TExtstrings aus Dateien zu extrahieren und diese wiederum zu manipulieren, da Perl bereits wichtige Funktionen mitbringt, die Sie auf bash-Ebene über das Kommandozeilentool awk nachrüsten müssen.

Jedoch eignen sich Shell-Skripte besser für das Verwalten von Jobs und Daemons. Denn wenn Sie beispielsweise ein Kommando in einem Bash-Skript ausführen und dieses fehlschlägt, etwa weil zu wenig RAM vorhanden ist oder die Prozesstabelle voll ist, dann wird Ihnen ein Fehler angezeigt. Wenn Sie hingegen ein Kommando über die system()-Funktionalität von Perl aufrufen, arbeitet das Skript einfach weiter, es sei denn, Sie stecken zusätzlichen Code in das skirpt, etwa

use autodie qw< :all >;
system("kommando");

Wenn wir das Beispiel weiterspinnen und Sie im Falle des Scheiterns eines Kommandos ein Recovery-Kommando ausführen wollen, um einen vorhersehbaren Fehler schon im Skript zu beheben, würde das bei einem Shell-Skript so aussehen

if ! run some command
then
    some recovery command
fi

und bie einem Perl-Skript so

use autodie qw< :all >;
use Try::Tiny;                  

try
{
    system("kommandozeile");
}
catch
{
    system("recoverykommando");
};                              

Sie sehen also, wenn es um die Kontrolle von Jobs und Prozessen geht, haben Sie bei Perl wesentlich mehr Arbeit zu leisten, sowohl beim Denken, als auch beim Schreiben.

Desweiteren haben Sie Probleme, wenn Sie ein Kommando ausführen wollen, sobald eine Kommandozeile beendet wird. Unter Perl würden Sie das folgendermaßen bewerkstelligen

END
{
    system("run some command");
}

in der Bash folgendermaßen:

trap "run some command" EXIT

Dabei zeigen Erfahrungen, dass das Bash-Skript immer funktioniert, bei Perl jedoch nicht immer. Überlegen Sie mal: es gibt so viele verschiedene Möglichkeiten, wie das Programm beendet werden kann-  über Strg+C durch den User, über erfolgreiches Beenden, über eine fehlermeldung, über einen Dump des Kernels, da er die Funtkionalität nicht unterstützt… all diese Fälle deckt ihr Shellskript ab – alle bis auf die Möglichkeit, dass der User über den Kill-Befehl den Job tötet, natürlich. Das kann jedoch auch Perl nicht.

ein weiterer Unterschied ergibt sich beim Skripten von interaktiven Programmen. Soll heißen: Wenn Sie ein Programm ausführen, welches während seiner Ausführungszeit den Command Line Prompt ändertund Ihnen die möglcihkeit gibt, Fragen und Atnworten an das Programm zu stellen. Ein gutes Beispiel wäre der mysql-Client. Nachdem Sie sich über das Programm an mySQL angemeldeet haben, ändert sich die Kommandozeile und Sie können SQL-Statements absetzen.

$>mysql
SQL>SELECT * from TABLE;

Ein anderes Beispiel wäre etwa das Erstellen eines SSL-Zeritfikats über OpenSSL, wobei Sie während der Erstellung des Zertifikats Fragen gestellt bekommen.

Solche interaktiven Programme können Sie mit sogenannten „Here-Documents“ skripten. Hierbei führen Sie im Skript zunächst das Programm aus und übergeben die Antworten von einer anderen Stelle des Programms. Über ein shelol-skript sieht das folgendermaßen aus

mysql <<END                       # assume ~/.my.cnf is set up
    select count(*) from some_table;
END

Bei PERL so

use autodie qw< :all >;

open(PIPE, "| mysql");
print PIPE <<END;
    select count(*) from some_table;
END
close(PIPE);

Nun haben wir die Bash an verschiedenen Stellen hoch gelebt. nun kommen wir dazu, warum es in vielen vielen Fällen trotzdem ratsamer ist, Perl zu wählen.

Perl ist schneller in der Ausführung. Es müssen beispielsweise nicht so viele verschiedene Prozesse ausgeführt werden, weil Sie nicht verschiedene Kommandozeilentools wie cut, grep, awk und andere tools miteinander kombinieren müssen, sondern Perl bereits alle Funktionalitäten mitbringt.

Mit Perl können Sie wie bereits erwähnt Textmanipulation auf einem höheren Level ausleben als mit einem Bash-Skript.

Mit Perl können Sie einfacher mit Variablen umgehen, beispielsweise mit Arrays, die bei einem Shell-Skript sehr unhändisch zu verwalten sind.

Windows: Batch vs PowerShell

Die Windows-Batch-Automatisierung ist eigentlich schon seit Jahren tot. Sobald es auf irgendeine Art und Weise komplizierter wird in Sachen Automatisierung stoßen Sie bereits sehr schnell an die Grenzen der automatisierbarkeit über Batch-Dateien. Batch kommt beispielsweise bei weitem nicht an die Möglichkeiten der Linux-Shell-Skripte heran.

Vergessen sollten Sie auch alle älteren Skripting-Technologien unter Microsoft wie beispielsweise VBscript oder JScript. Denn diese basieren auf dem Windows Script Host (WSH). Dieser wiederum ist limitiert auf COM-objekte die auf dem Computer installiert sein müssen. Sind sie es nicht, funktionieren die Skripte auf dem System nicht. Desweiteren bekommen Sie bei diesen Skripten keine Kommandozeile präsentiert.

Die Antwort auf diese Problematiken bietet Microsoft mit der Powershell, die erstmals 2006 released wurde. Sie können die PowerShell für jedes Windows-Betriebssystem nachrüsten, das derzeit noch im Einsatz ist: von Windows XP bis hoch zu Windows 10 und von Windows Server 2003 bis hoch zum aktuellsten Release. Bei neueren Windows-Versionen ist die PowerShell sogar standardmäßig mitgeliefert. Von daher gibt es heutzutage eigentlich überhaupt keinen Grund mehr, Automatisierungstasks über Batch-dateien zu versuchen. Denn: Powershell kann auch mit Batch-Datiene umgehen. Das heißt Sie können ohne Probleme ihre alten .bat- und .cmd-Skripte weiterhin mit der Powerhsell einsetzen und Sie mit neueren Skritpen kombinieren, die Sie nach dem Powershell-Standard schreiben.

 

Andreas Loibl ist SAP-Berater, Ethical Hacker und Online Marketing Manager und schreibt auf seinem Blog DaFRK Blog über verschiedene Themen in den Sektoren Projektmanagement, Informationstechnik, Persönlichkeitsentwicklung, Finanzen und Zeitmanagement.

DaFRK

Andreas Loibl ist SAP-Berater, Ethical Hacker und Online Marketing Manager und schreibt auf seinem Blog DaFRK Blog über verschiedene Themen in den Sektoren Projektmanagement, Informationstechnik, Persönlichkeitsentwicklung, Finanzen und Zeitmanagement.

Das könnte Dich auch interessieren...

Kommentar verfassen

This site uses Akismet to reduce spam. Learn how your comment data is processed.