Open Source im professionellen Einsatz
Linux-Magazin 02/2005

Shell-Funktionen in Perl nachgebaut

Muschelperle

Mit dem neuen Modul Sysadm::Install wagt Perl den Vorstoß ins Stammland von Bash & Co. Perl-Fan Michael Schilli behauptet: So gelingen die besseren Shellskripte.

651

Mit ein paar Shellkommandos sind Skripte für die Systemadministration schnell zusammengeklopft: Eine Installationsroutine mit »cp«, »mv« und »chmod« hier, eine mit »grep«, »awk« und »sed« gezimmerte Abfrage dort. Kommen weitere Anforderungen hinzu, werden die Skripte komplizierter, oft unübersichtlich. Zuweilen endet der Skripter in einer Sackgasse: Manches lässt sich in der Shell eben nicht oder nur sehr umständlich realisieren.

Kreative Programmierer finden zwar immer (zuweilen obskure) Wege, um Klippen zu umschiffen, und Shells wie Bash, Ksh und Tcsh bieten manche Vorzüge einer echten Programmiersprache. Außerdem ist Standard-Perl bei vielen einfachen Aufgaben nichts für faule Tipper. Wer will schon

open FILE, "<Filename" or
    die "Cannot open filename ($!)";


schreiben, wenn ein einfaches »cat Filename« die Datei in der Shell öffnen und ausgegeben kann? Sysadm::Install, ein neues Modul vom CPAN, schafft Abhilfe. Es exportiert Funktionen wie »cp«, »mv«, »untar«, »mkd«, »rmf« (»rm -f«) oder »cd«, damit Shellskripter sich in Perl zu Hause fühlen.

Darüber hinaus kennt es Funktionen für interaktive Benutzerabfragen, für die Dateimanipulation, den Download sowie vereinfachte Schnittstellen zum Aufruf externer Programme.

Transformer

Topng in Listing 1 zeigt ein Skript, das eine Reihe JPG-Bilder mit Hilfe des Utility »convert« ins PNG-Format umwandelt. Es holt mit »use Sysadm::Install qw(:all)« alle verfügbaren Funktionen in den aktuellen Namensraum. Zwei davon nutzt es: »sysrun()«, um ein externes Programm ablaufen zu lassen, und »rmf()«, die Sysadm::Install-Version von »rm -f«. Der Aufruf von

topng *.jpg


in einem Verzeichnis voller JPGs zeigt lange nichts - dann sind die PNGs fertig. Mehr Informationen gefällig? Das ist leicht: Da Sysadm::Install das Log::Log4perl-System unterstützt, reicht ein

use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init($DEBUG);


am Anfang des Skripts und schon wird es gesprächiger:

2004/12/03 23:25:20 sysrun: convert 1.jpg 1.png
2004/12/03 23:25:32 rmf 1.jpg
2004/12/03 23:25:32 sysrun: convert 2.jpg 2.png
2004/12/03 23:25:44 rmf 2.jpg


Aber das ist nicht der einzige Grund, warum das Skript »sysrun()« und »rmf()« aus dem Sysadm::Install-Fundus verwendet und nicht etwa Perls Standardfunktionen. »system()« und »unlink()«. »sysrun()« und »rmf()« laufen, wie alle Funktionen aus Sysadm::Install, in einem Run-or-die-Modus: Jedes Ergebnis wird hinter den Kulissen minutiös geprüft und das Skript bei einem Fehler sofort mit »die()« abgebrochen. Shellprogrammierer, die bislang immer

cp a b || exit 1
mv c d || exit 1


schreiben mussten, atmen sicherlich auf. Auch verwendet »topng« bewusst nicht den »strict«-Modus, der sonst in der Perl-Welt mit fast schon religiöser Strenge eingesetzt wird. Es ist ein Quick-and-dirty-Skript und es steht dazu.

Listing 1:
Topng

01 #!/usr/bin/perl -w
02 # topng -- Transform jpg pics to PNG
03 
04 use Sysadm::Install qw(:all);
05 
06 for $jpg (@ARGV) {
07     ($png = $jpg) =~ s/jpg$/png/;
08     sysrun("convert", $jpg, $png);
09     rmf($jpg);
10 }.

Elegant entblättert

Wer nicht täglich damit arbeitet, hat die passenden Optionen für »tar« vielleicht nicht immer im Kopf: Ist versehentlich die Option »cf« statt »xf« gesetzt, überschreibt »tar« ungewollt das Archiv, statt es zu entpacken. Außerdem gibt es immer noch Unbelehrbare, die kein einzelnes Top-Verzeichnis einpacken, sondern auf oberster Ebene alle möglichen Dateien hineinpfeffern, mit denen der Entpackende unfreiwillig sein aktuelles Verzeichnis zuschüttet. »untar()« macht Schluss damit. Es nimmt den Namen einer »tar«-Datei entgegen, findet heraus, ob eine Dekompression notwendig ist, und entpackt den Inhalt. Ist kein einzelnes Top-Verzeichnis enthalten, sondern ein wildes Tohuwabohu, erzeugt es ein Top-Verzeichnis und legt den Inhalt darin sauber ab.

Das Beispielskript »untar« in Listing 2 wird einfach mit dem Tarball-Namen aufgerufen, beispielsweise mit:

untar pari-2.1.4.tgz


Wer statt stoischer Ruhe lieber Informationen über den Ablauf wünscht, fügt die Option »-v« hinzu und erhält Details über die Transaktionen.

Listing 2:
Untar

01 #!/usr/bin/perl
02 # untar -- Untar tarballs
03 
04 use warnings;
05 use strict;
06 
07 use Log::Log4perl qw(:easy);
08 use Getopt::Std;
09 use Sysadm::Install qw(untar);
10 
11 getopts('v', my %opts);
12 
13 Log::Log4perl->easy_init(
14     $opts{v} ? $DEBUG : $ERROR);
15 
16 for my $tar (@ARGV) {
17    untar($tar);
18 }

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Wer Programme in der weiten Welt zu verteilen gedenkt, sollte sie vorab fit für fremde Kulturen machen. Um seine selbst verfassten Perl-Module auf mehreren Linux-Distributionen in einem Rutsch zu testen, schnappt sich Perlmeister Schilli die Linux-Containers-Technik und das ressourcenschonende Docker-Projekt.

  • Perl-Snapshot

    Eine Virtualbox-Installation fährt Schnappschüsse virtueller Maschinen in Sekundenschnelle von der Kommandozeile hoch und hilft dem vorsichtigen Nutzer, beim Browsen die Privatsphäre zu wahren und Perl-Module durch einen Smoketest zu schicken.

  • Frisch verwurstet

    Dieses Backup-System überrascht mit seinen inneren Werten: Mit präparierter Rescue-CD und einem Perl-Skript konserviert es den kompletten Festplatteninhalt von Clients via LAN auf einen Backupserver.

  • Auferstanden aus Archiven

    Ein Perl-Daemon beschert gelöschten Files ein zweites Leben und kann ungewollte Änderungen ungeschehen machen. Dafür überwacht er mit Hilfe der Kernelschnittstelle Dnotify eine Verzeichnishierarchie und integriert alle darin gefundenen Dateien transparent in ein eigenes Versionskontrollsystem.

  • Perl-Snapshot

    Mit Clonezilla gehen Systembackups und Restores mit nur wenigen Tastendrücken elegant von der Hand. Eine selbst produzierte Lösung reduziert den Aufwand auf das Einlegen einer CD, auf die der Admin zuvor ein Perl-Skript gebrannt hat.

comments powered by Disqus

Ausgabe 07/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.