2198545

Shell-Scripts für alle Fälle die unter Linux alles automatisieren können

07.06.2016 | 11:20 Uhr |

Shell-Scripts können unter Linux alles automatisieren, denn auch die grafische Oberfläche hört auf Terminalbefehle. Die Nachhaltigkeit ist unübertroffen: Ein Script, das vor zehn Jahren geschrieben wurde, läuft noch heute und wohl noch weitere Jahre.

Scripts für die verbreitete Bash-Shell sind keine Spaßveranstaltung, sondern harte Arbeit. Die wird aber belohnt mit Schnelligkeit, Zuverlässigkeit und Nachhaltigkeit. Ihre Einsatzbreite erhalten Shell-Scripts durch unzählige spezialisierte Kommandotools, die zum Teil zum Systemstandard gehören, zum anderen Teil schnell nachinstalliert sind. An dieser Stelle soll es um einfache Einsatzbeispiele gehen, die verbreitete Aufgaben berücksichtigen und noch eine gewisse Lesbarkeit bieten.

Tuning für das Linux-Terminal

Das interaktive Terminal selbst verdient vorab einige Automatismen und Anpassungen, die den Alltag wesentlich erleichtern:

Gefilterter Befehlsverlauf: Das Terminal kann die Befehlshistory nach der Teileingabe filtern, die Sie bereits eingeben haben – etwa „mount“. Dann erhalten Sie durch Drücken der Tasten Bild-oben und Bild-unten die früheren Kommandos angezeigt, die mit „mount“ beginnen. Dieser nützliche Service ist nicht überall Standard, den Sie, wo nicht vorhanden, in der Datei „/etc/inputrc“ mit root-Rechten einstellen sollten. Die beiden Zeilen

\"e[5~\": history-search-backward
\"e[6~\": history-search-forward

sind in der Regel bereits vorhanden, Sie müssen nur das Kommentarzeichen „#“ entfernen.

Lese-Tipp: Die 10 wichtigsten Linux-Befehle für Netzwerk und Internet

Farbige Dateien und Ordner: Das Terminal stellt Dateitypen und Ordner in unterschiedlichen Farben dar. Wenn Sie bestimmte Farben ändern möchten, erstellen Sie mit folgendem Befehl eine persönliche Konfigurationsdatei im Home-Verzeichnis:

dircolors -p > ~/.dircolors

Die versteckte Datei „.dircolors“ öffnen Sie mit einem beliebigen Editor und stellen einzelne Farbdefinitionen um. So werden zum Beispiel Ordnernamen gelb gefärbt:

DIR 01;33

Die Einstellungen Ihrer Farbtabelle dominieren über die Standardeinstellungen. Die Farbcodes sind im Web etwa unter https://wiki.archlinux.de/title/Bash-Prompt_anpassen dokumentiert.

Befehlskürzel in der Datei „.bashrc“: Erste, aber immer noch interaktive Automatismen erreichen Sie mit Aliases und Funktionen in der Datei „$HOME/.bashrc“. Diese Datei wird bei jedem Start des Terminals geladen. Folgende dort definierte Aliases

alias 2d='cp -target-directory=$HOME/Schreibtisch/ $1'
alias 2dd='mv $1 -target-directory=$HOME/Schreibtisch/'

kopieren („2d [Datei]“) oder verschieben („2dd [datei]“) die angegebene Datei zum Desktop. Beachten Sie, dass der Desktopordner je nach Linux-System auch „Desktop“ oder „Arbeitsfläche“ heißen kann. Die Variable „$1“ steht für den Dateinamen, der etwa mit

2d Dokument.odt

übergeben wurde.

Obwohl Aliases auch mehrere mit Semikolon getrennte Befehle aufnehmen können, ist die Grenze der Strukturierbarkeit und Lesbarkeit hier schnell erreicht. Folgendes Miniscript ist als Funktion realisiert, die Sie in überschaubarer Menge ebenfalls in der Datei „.bashrc“ aufnehmen können:

function mdd()
{
verz=$1_$(date +%d.%m.%y)
mkdir $verz
}

Dies erstellt einen neuen Ordner mit dem aktuellen Datum, also etwa nach

mdd ordner

Das Verzeichnis „ordner_14.03.16“. „$1“ übergibt hier wieder den eingegebenen Namen. Wenn das Ergebnis auch bei häufiger Verwendung eindeutig sein, dann erweitern Sie eine Zeile:

verz=$1_$(date +%d.%m.%y)_[$(date +%s)]

Das fügt zusätzlich die Sekunden seit 1.1.1970 an und macht den Ordnernamen in jedem Fall eindeutig.

Lese-Tipp: Die Linux-Konsole im Griff: Shell-Tipps und -Tricks

Schnell den Desktop freiräumen

Ein einfaches Script, um den Desktop aufzuräumen, beschränkt sich im Prinzip auf einen Zweizeiler mit dem Kommando „mv“, mit dem Sie auf der Kommandozeile Dateien verschieben können:

#!/bin/bash
cd "$HOME/Schreibtisch"
mv *.* $HOME/Deskophalde

Wie jedes Script lässt sich natürlich auch dieses verbessern:

#!/bin/bash
ziel="$HOME/Desktophalde"
if [ ! -d $ziel ]; then mkdir $HOME/Desktophalde
fi
cd "$HOME/Schreibtisch"
mv *.* $HOME/Desktophalde

Durch die Abfrage, ob der Zielordner existiert, wird das Script fehlertoleranter. Wer seine Scripts so anpassungsfähig wie möglich halten will, wird in solchen Fällen auch den „Schreibtisch“ auf Existenz prüfen und im Fehlerfall andere Varianten ausprobieren („Arbeitsfläche“).

Das kleine Script links oben wandelt WMA-Audio zu WAV-Dateien ins Zielformat MP3 um.
Vergrößern Das kleine Script links oben wandelt WMA-Audio zu WAV-Dateien ins Zielformat MP3 um.

Audioformate per Shell-Script umwandeln

Shell-Scripts können Bilddateien (siehe nächsten Tipp), Audio-, Video-oder Dokumentformate automatisch konvertieren. Das Beispiel in der Abbildung oben zeigt die Umwandlung von Audiodateien des Microsoft-Formats WMA nach MP3. Das Script erwartet, dass man zunächst mit cd manuell in das betreffende Verzeichnis wechselt und dann an Ort und Stelle das Script startet. Die notwendigen Hilfsmittel sind in diesem Fall mplayer und lame, beides unter gleichnamigen Paketnamen überall verfügbar. Mplayer generiert aus der Ausgangsdatei eine temporäre WAV-Datei, die Lame dann im nächsten Schritt als MP3 ablegt – alles im Verzeichnis der Quelldaten. Die WAV-Dateien werden danach wieder gelöscht. Das Script an sich ist alles andere als kompliziert, jedoch ist das richtige Quoting der Dateinamen durchaus heikel. Das gewährleistet, dass auch Dateinamen mit Leerzeichen korrekt verarbeitet werden.

Auch interessant: Terminal-Tuning: Linux-Tricks für mehr Komfort

Bildformate per Shell-Script konvertieren

Wer Hunderte von Fotos von einem Format in ein anderes übertragen muss, kann manuell Stunden mit stereotypen Klicks in einer Bildbearbeitung verbringen. Auch das ist ein klarer Fall für ein Shell-Script. Notwendiger und nicht standardmäßig installierter Helfer ist hier Imagemagick mit seinen Terminaltools, das mit gleichnamigen Paketnamen schnell nachinstalliert ist. In diesem Fall ist es das Tool convert, das den Job erledigt:

#!/bin/bash
inputdir=$PWD
ext="jpg"
for pic in "$inputdir"/*.png
do
bildname=$(basename "$pic" png) convert "$pic" "$inputdir/$bildname.$ext";
done

Das Script setzt voraus, dass Sie vor dem Scriptaufruf mit cd in das richtige Verzeichnis navigieren. Als Ausgangsformat ist hier PNG angenommen, als Zielformat JPG. Die konvertierten Dateien werden in denselben Ordner geschrieben. Wesentlich ist die Konstruktion „For – Do – Done“, die alle (PNG-)Dateien des Ordners erfasst und im Do-Block die gewünschten Aufgaben erledigt.

Bildschirmhintergrund wechseln

Das folgende Script ist ein Beispiel dafür, wie Shell-Scripts die Desktopoberfläche steuern können. Das Script wechselt im Dreisekundentakt den Desktophintergrund.

#!/bin/bash
for dat in $HOME/Bilder/*.jpg
do
gsettings set org.gnome.desktop.background picture-uri "file:///$dat"
sleep 3
done

Um bei dem aktuell angezeigten Hintergrund dauerhaft zu bleiben, unterbrechen Sie das Script einfach mit Strg-C. Das ist natürlich eleganter zu lösen, der Code soll aber nur das Prinzip zeigen. Der Quellordner muss angepasst werden, wenn „$HOME/Bilder“ in Ihrem Fall ungeeignet ist.

Das Listing nutzt das Tool scrot, um Varianten von Bildschirmfotos am Desktop abzulegen.
Vergrößern Das Listing nutzt das Tool scrot, um Varianten von Bildschirmfotos am Desktop abzulegen.

Screenshots auf den Desktop speichern

Das Shell-Script „Shots.sh“ in der Abbildung oben zeigt, wie Sie das Kommandozeilenprogramm scrot einsetzen, um Screenshots auf dem Desktop zu speichern. Scrot muss mit dem gleichnamigen Paketnamen nachinstalliert werden. Das Script hat gegenüber grafischen Alternativen die Vorteile, den Ablageort frei vergeben und den Modus direkt übergeben zu können. Außerdem erhält jedes Bild einen eindeutigen Namen, und Sie werden nicht durch Namensvergaben gebremst. Der Aufnahmemodus wird durch Parameter angefordert: „shot 1“ (oder nur „shot“) macht ein Vollbild, „shot 2“ ein Fensterbild, „shot 3“ startet den Auswahlmodus mit der Maus. Hinzu kommt die Variante „shot 4“, die eine Screenshotserie im vorgegebenen Acht-Sekunden-Takt ablegt. Die While-Endlosscheife beenden Sie einfach durch Strg-C.

Infos einsammeln und mit Notify ausgeben

Das kleine Tool notify-send ist oft schon vorinstalliert. Es schickt kleine Meldungen als schickes OSD-Fenster an den Desktop. Damit können Sie sich ein Infosystem im Netzwerk einrichten, das Sie über Ihre Rechner auf dem Laufenden hält. Im Prinzip:

#!/bin/bash
while true; do
if [ -f /media/ha/odroid/notiz.txt ]; then
notify-send "INFO" "`cat /media/ha/odroid/notiz.txt`"
fi
sleep 60
done

Das Script ist denkbar einfach, die Organisation allerdings anspruchsvoller: Alle relevanten Rechner müssen per Cron-Script die gewünschten Infos in die Datei „notiz.txt“ eintragen (mit Output-Umleitung „>“ oder „>>“), die auf einer von allen zugänglichen und schreibberechtigten Netzwerkfreigabe liegen muss.

Außerdem sollten die Infos etwa mit knappen „uname“-, „uptime“-, „df“-Kommandos dem Format des kleinen OSD-Fensters Rechnung tragen.

Von der Idee zum funktionierenden Shell-Script

Es gibt für jede Aufgabe unzählige Lösungsvarianten. Trotzdem ist der Weg zum lauffähigen Script im Prinzip immer ähnlich: Sie müssen erst einmal die benötigten Kommandotools kennen und gegebenenfalls nachinstallieren.

Eine genaue Kontrolle der verfügbaren Befehlsparameter zeigt dann („--help“ oder Man-Page), wie Sie am besten zum gewünschten Ergebnis kommen. Danach geht es um den Einbau der Tools in die Ablaufstruktur mit FOR-und WHILE-Schleifen und IF-oder CASE-Entscheidungen.

Besonders aufwendig ist oft das richtige Quoting der Übergabeparameter. Fehler sind hier gut nachzuweisen, wenn Sie einem komplexen Befehl erst einmal ein „echo [befehl]“ voranstellen und dann die Ausgabe kontrollieren. Wenn alles im Prinzip läuft, kann Fehlertoleranz und Bedienkomfort ausgebaut werden.

Die Entscheidung, ob ein Script als minimales Alias in der Datei „.bashrc“, als Funktion in der „.bashrc“ oder als eigenständige Scriptdatei mit der Endung „.sh“ zu bevorraten ist, hängt von der Komplexität und der Einsatzhäufigkeit ab. Funktionen unterscheiden sich vom eigenständigen Shell-Script im Wesentlichen nur durch den Aufbau

Function name()
{

}

Scriptdateien werden erst lauffähig, wenn Sie im Dateimanager unter „Eigenschaften -> Zugriffsrechte“ ausführbar geschaltet werden (alternativ geht auchchmod a+x [Dateiname] im Terminal). Danach genügt der Aufrufsh [Pfad]/[scriptname].sh oder ./[Pfad]/[scriptname].sh im Terminal.

Ein Script mit Execute-Bit startet auch nach Doppelklick in der grafischen Oberfläche. Unter Ubuntu ist allerdings ein Abfragedialog zwischengeschaltet (Option „ask“). Dies lässt sich im dconf-editor unter „org -> gnome -> nautilus -> preferences“ auch auf „launch“ setzen, wonach Scripts sofort starten.

0 Kommentare zu diesem Artikel
2198545