HomeSoftwareSpieleMusikForum

Shellfunktionen laden

Hier zunächst einige Bemerkungen zu der Frage, wann, wo und wie Shellfunktionen geladen werden.

Konfigurationsdateien: Prinzipiell können Shellfunktionen in einer der Konfigurationsdateien (.profile, .bashrc etc.) definiert werden, damit sie beim Start jeder Shell automatisch definiert sind. Es ist aber nicht sinnvoll, jedesmal alle vorhandenen Shellfunktionen zu laden. Einige (z.B. Bash-Vervollständigungen) braucht man nur im interaktiven Modus, andere nur in speziellen Scripten. Im nicht-interaktiven Betrieb sollte man gar keine Funktionen vordefinieren, sondern lieber eine saubere Umgebung anbieten und die benötigten Funktionen im Script mit datei oder source datei laden. Dabei empfiehlt es sich, auf absoluten Pfade zu verzichten, die das Script stark an die Systemumgebung koppeln und seine Portabilität vermindern. Besser ist es, den Suchmechanismus der Shell zu verwenden.

Suche: Wenn der bei source oder . angegebene Parameter einen einfachen Namen darstellt, durchsuchen die Shells (sowohl bash als auch ksh) die in $PATH enthaltenen Verzeichnisse nach einer Datei dieses Namens. Die erste gefundene wird mit source ausgeführt. Die Shell erwartet, dass darin die aufgerufene Funktion definiert wird, andernfalls, versucht sie, die Datei als Script zu starten. Um den Suchmechanismus benutzen zu können, muss man also jede Funktion in einer gleichnamigen Datei abspeichern. In dieser Datei können auch noch andere Dinge definiert werden, etwa von der Hauptfunktion benötigte Hilfsfunktionen, aber man sollte solche Seiteneffekte auf ein Minimum beschränken. Die Funktionsquellen fasst man sinnvollerweise in einigen wenigen Verzeichnissen zusammen und fügt die Pfade dieser Verzeichnisse, wie üblich durch : getrennt, der Variablen PATH hinzu. Das z.B. kann in einer der profile-Dateien geschehen. Danach lassen sich Funktionen unter bloßer Angabe ihres Namens laden, d.h. mit source funktionsname.

Autoload: Die Kornshell verfügt zudem über einen Autoload-Mechanismus. Um ihn benutzen zu können, muss man zusätzlich zu den oben erwähnten Vorbereitungen die Variable FPATH mit einer Liste der Funktionsverzeichnisse besetzen. $FPATH ist also eine Untermenge von $PATH. Wenn diese Bedingungen erfüllt sind, sucht ksh jede aufgerufene Funktion, die noch nicht definiert ist, über $FPATH und lädt sie automatisch. Ein explizites source ist nicht erforderlich.

Das ist bequem, allerdings kann das Verfahren auch Nachteile haben. Ruft man nämlich eine Funktion func in einem Script nur in der Form $(func parameter...) auf, also nur in Subshells, wird sie bei jedem Aufruf gesucht und geladen, was ziemlich ineffektiv ist. [1] In diesem Fall empfiehlt es sich, die Funktion am Beginn des Scripts explizit mit source func zu laden; danach wird die Definition automatisch an Subshells weitergegeben. Achtung: Diese Anweisung darf wirklich nur einmal gegeben werden. Ist func bereits definiert, bewirkt source func einen Aufruf, nicht eine Neudefinition. Um sicher zu gehen, kann man statt des Namens den absoluten Pfad der Definitionsdatei angeben oder eine Bedingung vorschalten:

typeset +f func >/dev/null || source func


[1] Ab Version ksh93t gibt es eine effizientere Kommandoersetzung ${ kommando;}, die in der aktuellen Shell durchgeführt wird.

up
Created 2010-06-17 by mopcoge